2

私はOpenGLを使用して小さなゲームを書いています(JavaではJOGLを使用していますが、それはほとんど問題ではないと思います)。最近、OpenGLエラー「1285」が発生したというエラーレポートがかなりあります。これは「メモリ不足」を示しているようです。 "。これは、新しいテクスチャを作成した後で確認するときにglGetErrorわかります。これにより、テクスチャのメモリが不足しているように感じられます。

しかし、これは私を少し驚かせます。OpenGLは、必要に応じてGPUとプロセスメモリ間でテクスチャを交換して、テクスチャメモリを管理することになっているのではないですか?の仕様にglTexImage2Dは、確かに、考えられるエラー条件のいずれかとして「メモリ不足」エラーは含まれていません。

これは、仕様にかかわらず、OpenGLドライバーで一般的に受け入れられている方法ですか?仕様にもかかわらず、これを行っているのは一部のドライバーだけですか?後でこのエラーが発生した場合、しばらく使用されていないテクスチャを削除するように注意する必要がありますglTexImage2Dか?それとも、OpenGLのエラー報告が私に完全に簡潔に伝えていない何かをここで完全に見ているのでしょうか?

編集:詳細については、残念ながら、問題を自分でデバッグすることはできません。問題が発生していないためです。人々が私に送ったレポートを読むと、これに苦しんでいる人の大多数はIntelカードを使用しているようですが、私はいくつかのnVidiaカードも見つけました(680でも)。

4

1 に答える 1

1

これは単なる推測ですが、プログラムがアドレス空間の断片化に悩まされている可能性があります。その場合、実際に重要なのは、Javaランタイムで実行していることです。

OpenGL、つまり実装は、すべてのデータオブジェクトのコピーを保持して、オンデマンドでそれらを交換できるようにする必要があります。しかし、それらのコピーには、プロセスのアドレス空間が必要です。また、プロセス環境で多くの割り当て/割り当て解除が行われる場合、これはJavaの性質(ほぼすべてのオブジェクトを作成する)であり、アドレススペースが断片化されて、大きなチャックを割り当てられなくなる可能性があります。 。

確認すべきいくつかのポイント:プログラムは32ビットまたは64ビットのJREで実行されていますか。32ビットの実行可能ファイルの場合は、64ビットのJREを使用するとどうなるか試してみてください。問題が64ビット環境で消え、32ビット環境の同じマシン上にある場合、それは確かにアドレス空間の断片化の問題です。

于 2012-12-04T21:39:02.730 に答える