現在、私のアプリはテクスチャをロードした後に大量のメモリを使用しています(〜200Mb)
テクスチャをcharバッファにロードし、OpenGLに渡してから、バッファを強制終了します。
このメモリは、内部で独自のテクスチャ管理を行っているOpenGLによって使用されているように見えます。
これを減らすためにどのような対策をとることができますか?
OpenGLがテクスチャを内部で管理するのを防ぐことは可能ですか?
現在、私のアプリはテクスチャをロードした後に大量のメモリを使用しています(〜200Mb)
テクスチャをcharバッファにロードし、OpenGLに渡してから、バッファを強制終了します。
このメモリは、内部で独自のテクスチャ管理を行っているOpenGLによって使用されているように見えます。
これを減らすためにどのような対策をとることができますか?
OpenGLがテクスチャを内部で管理するのを防ぐことは可能ですか?
このメモリはOpenGLによって使用されているようですが、
はい
独自のテクスチャ管理を内部で行っています。
いいえ、テクスチャ管理ではありません。データをどこかに保持する必要があります。最新のシステムでは、GPUは同時に実行される複数のプロセスによって共有されます。また、すべてのデータが高速GPUメモリに収まるとは限りません。したがって、OpenGL実装はデータをスワップアウトできる必要があります。GPU高速メモリはストレージではなく、単なる別のキャッシュレベルです。システムメモリがシステムストレージ用のキャッシュであるのと同じように。
また、GPUがクラッシュし、最新のドライバーがユーザーに気付かれることなくGPUをその場でリセットする可能性があります。このためには、データの完全なコピーも必要です。
OpenGLがテクスチャを内部で管理するのを防ぐことは可能ですか?
いいえ、これは面倒であるか、物事を壊すためです。しかし、できることは、特定のシーンを描画するために本当に必要なテクスチャのみをロードすることです。
OpenGLについての私の執筆を見ると、何年もの間、「initGL」関数のようなばかげたものを書かないように人々に言っていることに気付くでしょう。すべてを描画コードに入れます。とにかく描画スケジューリングフェーズを通過します(半透明のオブジェクトを遠くから近くに並べ替える、錐台のカリングなどを行う必要があります)。これにより、必要なテクスチャを確認してロードすることができます。シーンが最初に表示されたときに詳細が低くなるように、低解像度のミップマップレベルのみをロードして、バックグラウンドで高解像度のミップマップをロードすることもできます。もちろん、これには、テクスチャまたはサンプラーパラメータとして設定する最小および最大ミップレベルの適切な設定が必要です。
典型的な解決策の 1 つは、カメラまたはタイム フレームの特定の位置で必要なテクスチャを追跡し、必要なときにのみそれらをロードすることです (アプリのロード時にすべてのテクスチャをロードするのではなく)。glBindTexture によって割り当てられた、それぞれのテクスチャ番号 (文字列、テクスチャの名前、整数を関連付けるコンテナなど) のロード/アンロードと境界を制御する「マネージャ」が必要です)。
他のオプションは、使用しているテクスチャの全体的な品質/サイズを減らすことです。