我正在尝试使用 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条经验 获得超8个赞
实际上,这是个坏主意。您不能将 GL 实例存储到字段中,因为它很容易出错,原因有以下几个:
GL 实例随时可能失效
您可以在 OpenGL 上下文不是当前的线程上访问它
您可以在 OpenGL 上下文已成为当前线程的线程上访问它,但有时它不是当前的(在释放上下文之后)
这就是您应该使用 GLEventListener 的原因。否则,您可以通过调用GLContext.getCurrentGL()获取有效的 GL 实例,但如果没有当前上下文,它会抛出 GLException。您也可以使用GLAutoDrawable.invoke(),它允许在正确的时间在正确的线程上运行您的代码,但 GLEventListener 更有用,因为您可以在初始化时执行一些代码。
顺便说一下,JOGL 的具体问题应该在官方 JogAmp 论坛上而不是在这里提问。StackOverflow 是解决一般 OpenGL 问题的好地方,但大多数 JogAmp 贡献者从来没有来过这里。是的,StackOverflow 不是灵丹妙药。
PS:如果你想了解JOGL的设计选择,尤其是实例设计,我建议你阅读这篇文章和评论。
添加回答
举报
0/150
提交
取消