我正在嘗試使用 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
提交
取消