为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 JOGL 中静态使用 GL 对象?

如何在 JOGL 中静态使用 GL 对象?

哔哔one 2023-03-02 15:53:47
我正在尝试使用 JOGL 制作一个简单的游戏引擎。但是我不想使用 EventListener 类,而是像在 LWJGL 中那样创建一个静态对象。不,我不使用 LWJGL,因为我遇到了很多麻烦。这是我的事件监听器:class EventListener implements GLEventListener {    public static GL2 gl;    @Override    public void display(GLAutoDrawable drawable) {        gl = drawable.getGL().getGL2();        gl.glClear(GL.GL_COLOR_BUFFER_BIT);        gl.glClearColor(0, 1, 0, 1);    }    @Override    public void dispose(GLAutoDrawable drawable) {    }    @Override    public void init(GLAutoDrawable drawable) {    }    @Override    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {    }}在主类中,它清除了一个绿屏,因此它可以完美地工作。但是,如果我尝试在其他类中使用“gl”对象,它什么也不做。提前致谢!
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超7个赞

实际上,这是个坏主意。您不能将 GL 实例存储到字段中,因为它很容易出错,原因有以下几个:

  • GL 实例随时可能失效

  • 您可以在 OpenGL 上下文不是当前的线程上访问它

  • 您可以在 OpenGL 上下文已成为当前线程的线程上访问它,但有时它不是当前的(在释放上下文之后)

这就是您应该使用 GLEventListener 的原因。否则,您可以通过调用GLContext.getCurrentGL()获取有效的 GL 实例,但如果没有当前上下文,它会抛出 GLException。您也可以使用GLAutoDrawable.invoke(),它允许在正确的时间在正确的线程上运行您的代码,但 GLEventListener 更有用,因为您可以在初始化时执行一些代码。

顺便说一下,JOGL 的具体问题应该在官方 JogAmp 论坛上而不是在这里提问。StackOverflow 是解决一般 OpenGL 问题的好地方,但大多数 JogAmp 贡献者从来没有来过这里。是的,StackOverflow 不是灵丹妙药。

PS:如果你想了解JOGL的设计选择,尤其是实例设计,我建议你阅读这篇文章评论。


查看完整回答
反对 回复 2023-03-02
  • 1 回答
  • 0 关注
  • 54 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信