2011-12-06 44 views
1

我有一些我寫的CAD軟件。繪製的每個組件都有一組頂點緩衝區對象。如果組件被刪除,我必須釋放在finalize方法頂點緩衝對象,如:JVM使用JOGL,頂點緩衝區對象崩潰,並試圖在finalize方法中釋放vbo

if (gl != null) { 
     Integer[] keys = vbos.keySet().toArray(new Integer[0]); 
     for (int i = 0; i < keys.length; i++) { 
      Integer tmp = keys[i]; 
      if (tmp != null) { 
       if (gl.glIsBufferARB(tmp.intValue())); 
       gl.glDeleteBuffersARB(1, new int[]{tmp.intValue()}, 0); 
      } 
     } 
    } 

但我有時會收到一個SIGSEV和JVM崩潰。 hs_err日誌文件指向gl.glIsBufferArb(tmp.intValue())。

我相信這意味着我的gl對象不再有效嗎?

它應該仍然有效,我認爲。該方案仍在運行直到崩潰。有沒有一種方法來釋放glbuffer而不存儲對GL對象的引用?

謝謝!

回答

4

你將要遇到的最明顯的問題是,OpenGL上下文只能在它活動的線程中被引用。一般來說,這將是你的渲染線程,這意味着OpenGL上下文不會在JVM的終結器線程中可用。對我而言,這似乎是你錯誤的最可能原因。我建議你保留一個全球無效的維也納國際組織的清單,並將finalize方法添加到該清單中。然後,您可以定期從渲染線程處理該列表,使OpenGL調用實際上可以刪除VBO。

您可以在多線程環境here中找到關於OpenGL行爲的簡要說明。

+0

這是一個很好的建議,謝謝! – vextorspace

相關問題