2011-12-06 9 views
1

私が書いたCADソフトウェアがあります。描画される各コンポーネントには、頂点バッファオブジェクトのセットがあります。私は時々SIGSEVとJVMがクラッシュを取得しかしJVML、頂点バッファオブジェクトを使用してJVMがクラッシュし、ファイナライズメソッドで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); 
      } 
     } 
    } 

:コンポーネントが削除される場合は、私のようなfinalizeメソッドで頂点バッファオブジェクトを解放しなければなりません。 hs_errログファイルはgl.glIsBufferArb(tmp.intValue())を指しています。

私のglオブジェクトはもはや有効ではないと思いますか?

私はまだ有効だと思います。プログラムはまだクラッシュするまで動作していました。 GLオブジェクトへの参照を格納せずにglbufferを解放する方法はありますか?

ありがとうございました!

答えて

4

OpenGLコンテキストは、アクティブなスレッドでのみ参照できるということです。一般に、これはレンダリングスレッドになります。つまり、OpenGLコンテキストは、 JVMのファイナライザスレッドで利用可能になります。それは、私には、あなたのエラーの最も可能性の高い原因と思われる。無効化されたVBOのグローバルリストを保持し、finalizeメソッドでそのリストにIDを追加することをお勧めします。このリストをレンダリングスレッドから定期的に処理して、VBOを実際に削除するのに必要なOpenGL呼び出しを作成することができます。

マルチスレッド環境でのOpenGLの動作については、すぐに確認できます。here

+0

これは素晴らしい提案です。ありがとうございます! – vextorspace

関連する問題