1

私は自分で書いた CAD ソフトウェアをいくつか持っています。描画される各コンポーネントには、一連の頂点バッファー オブジェクトがあります。コンポーネントが削除された場合、次のような finalize メソッドで頂点バッファー オブジェクトを解放する必要があります。

    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 オブジェクトが無効になったことを意味すると思いますか?

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

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

4

1 に答える 1

4

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

ここでは、マルチスレッド環境での OpenGL の動作に関する簡単な要約を見つけることができます。

于 2011-12-06T21:43:28.307 に答える