2009-03-27 19 views
2

JavaでopenGLを使用する場合(joglなどのバインディングで)、メモリ管理について心配する必要はありますか? JVMは、作成されたOpenGLオブジェクトでガベージコレクションを行いますか?もしそうなら、クリーンアップにアプローチする最善の方法は何ですか?OpenGL、Java、メモリ管理

答えて

1

JOGLのようなOpenGLの下位レベルのバインディング(Java3Dのようなライブラリではあまりないかもしれません)では、glDelete関数を呼び出すことで、テクスチャやバッファなどのリソースを自分で管理する必要があります。

OpenGLは、レンダリングのために必要なときに、ビデオメモリとの間でテクスチャを移動するようなことを行います。 JavaガベージコレクタがOpenGLに渡されるとJavaオブジェクトとして表されないため、これらのリソースを収集する実際的な方法はありません。はい、これは、OpenGLで使用されているリソースのリストを保持しなければならないことを意味します。

良いニュースは、おそらくあなたが考えているよりも多くのリソースをOpenGLに読み込むことができるということです。なぜなら、必要なときにビデオメモリにスワップし、必要でないときはメインメモリに戻すためです。悪い知らせは、この「スラッシング」なしでフレームをレンダリングするために使用できるリソースのサイズおよび数(例えば、テクスチャ)には依然として実際的な制限があるということです。

0

私はそれが所有権を実装する方法を選択する "接着剤"またはバインディングに少し依存していると思います。

一般に、バインディングはOpenGLセマンティクスに固執することが予想されます。つまり、JVMはOpenGLライブラリが保持するデータのガベージコレクションには関係しません。

多くの場合、たとえば。テクスチャのアップロード、私はこれが働くことができる唯一の方法だと思います。