2011-12-06 13 views
2

私は多くの小さなテクスチャでOpenGLアプリケーションを構築しています。私はある時点でスクリーン上に数百個のテクスチャを持っていると推測します。OpenGLでたくさんの小さなテクスチャを保存する

潜在的なパフォーマンスの問題を避けるために、これらのテクスチャをすべてメモリに保存することをお勧めしますか?

OpenGLがどのようにテクスチャを管理しているかを理解することにも興味があります。 OpenGLはそれらをGPUメモリに保存しようとしますか?もしそうなら、私はどれくらいのGPUメモリを使うことができますか?そうでない場合は、OpenGLがアプリケーションメモリからGPUにテクスチャを渡す頻度はどれくらいですか?これが起こると待ち時間が心配すべきですか?

私はOpenGL 3.3で作業しています。私は現代的な機能、すなわち即時モードのものだけを使用するつもりです。

答えて

8
  1. あなたは小さなテクスチャの数が多い場合は、既知のサブ領域を占有小さなテクスチャのそれぞれに単一の大きなテクスチャにそれらを組み合わせた最高のオフになります(技術は時々「テクスチャアトラス」と呼ばれます) 。バインドされているテクスチャを切り替えることは、どれくらいの量の図面を一緒にバッチすることができるかという点で高価になる可能性があります。 1つに結合することで、再バインドする回数を最小限に抑えることができます。また、テクスチャのサイズが非常に似ている場合は、配列テクスチャ(紹介here)を使用して調べることもできます。
  2. OpenGLは可能な限りGPUメモリにテクスチャを保存しようとしますが、実際にはグラフィックカードに存在することは保証されているとは思われません。
  3. 利用可能なGPUメモリの量は、実行するハードウェアと実行時のシステムに対するその他の要求によって異なります。正確に「GPUメモリ」が意味することは、マシン間でばらつきがあり、GPUのみで使用されたり、メインメモリと共有されたり、2つの組み合わせが異なる場合があります。
  4. アプリケーションがテクスチャを絶えず変更していないと仮定すると、レイテンシの問題を特に気にする必要はありません。 OpenGLにテクスチャを一度提供し、その時点からメモリ内の位置を管理します。フレームごとにGPUメモリに簡単に収まるテクスチャデータを必要としないと仮定すると、それは心配する必要はありません。大量のテクスチャデータを使用する必要がある場合は、データの往復回数を最小限に抑えるために、すべてのテクスチャを一括してバッチ処理するようにしてください。また、glTexImage2Dへの電話にGL_COMPRESSED_RGBAのようなものを提供する内蔵のテクスチャ圧縮機能を調べることもできます。詳細はmanページを参照してください。

もちろん、いつものように、予想されるユースケースに近い状況で、これらのことを自分でテストすることが最善の方法です。 OpenGLは数多くの保証を提供していますが、実装によっては多くの違いがあります。

+0

+1テクスチャアトラス用。素晴らしい方法。私はそれを実装するのに十分なチュートリアルがあることを願っています。 – Marnix

+0

ありがとう!それは素晴らしいです。チュートリアルについて:テクスチャアトラスのように思えるのは基本的にスプライトシートと同じですが、利用できるリソースはたくさんあります。質問:私が他の場所で読んだことは、通常、少なくとも256MBのGP​​Uメモリを使用できることを示しています。テクスチャ+ジオメトリがそれを超えると、パフォーマンスが大幅に低下します。それは正しいと思いますか? – rlkw1024

+0

@Jarrettローエンドのコンピュータをターゲットにしていないと仮定した場合、256 MBは非常に妥当な下限のように聞こえます。過去4〜5年のディスクリートグラフィックスカードを持っているものであれば、少なくとも256MBのVRAMが必要です。あなたがハイエンドの、より最近のコンピュータをターゲットにしているなら、あなたは少なくともその2倍に頼ることができます。専用カードを搭載したラップトップでさえ、一般的にVRAMを搭載しています。 – nonVirtualThunk

関連する問題