16ビットインデックスバッファーの使用-USHORTとUINT


7

D3D11では、16ビットと32ビットのインデックスバッファーを作成する機能がまだあります。

USHORTインデックスバッファーが処理できる最大(20kトライ)より多くを使用するモデルはほとんどありませんが、INT(32ビット)形式を常に使用するために実際に悪いパフォーマンスコストを支払うのでしょうか?

メモリの節約はそれほどではありません(インデックスごとに2バイトです)。20kのトライモデルの場合、USHORTを使用するために節約しているメモリはわずか40 kBです(同じモデルの頂点データだけの場合と比べて、おそらくもっと多くのメモリと比較されます)。

USHORTインデックスバッファーを使用することは本当に価値がありますか?それとも、90年代にコンピューターのメモリが少なくなったときからのホールドオーバーですか?


3
そのようなモデルを100個ロードしている場合は、40 mBのメモリが節約されます。特定の状況では、可能な限り多くのメモリを節約することは価値があります(ただし、すべてのゲームに依存し、90%のプロジェクトでは実際には価値がありません)
thedaian

2
@thedaian:それが答えです。

3
@thedaian、私が知る限り、あなたの数字は10 ^ 8倍ずれています。100 * 40 kBは4 MBになります。いずれにせよ、私は200万の三角形一般を扱うことについてもっと心配するでしょう。20kはほとんどのモデルで多く、1kと優れたバンプマップで非常に遠くまで行くことができます。
aaaaaaaaaaaa 2011

2
帯域幅も重要です。保存された4MBは、GPUメモリにアップロードするために4MB少なくなります。実際にこれを行う頻度はあなた次第です。
Justicle 2011

1
16ビットのインデックスバッファーで64kの三角形を作成できます。三角形のリストの代わりに三角形のストリップを使用してください。
Adam

回答:


10

頂点シェーダーにフィードするためのデータをフェッチするとき、GPUは同時に少数の三角形しかキャッシュできないため、多数の小さな呼び出しが必要であり、VRAMからのデータのフェッチは非常に遅い操作であることを考慮する必要があります。したがって、インデックスに半分のバイトを使用すると、GPUはキャッシュの2倍のインデックスをフェッチして三角形をレンダリングできると思います。

4MB記憶域用に少量のメモリを使用できますが、それらから数バイトのみを処理するために複雑な呼び出しを行う必要がある場合は、顕著な方法でパフォーマンスに影響を与える可能性があります。最近のビデオカードは、多くのジオメトリを処理する必要のないゲームでは無関係になるほど強力です。本当に知りたい場合は、両方のインデックスサイズでモデルをレンダリングするベンチマークを行うことができます。

また、メモリアライメントと適切なページングを効果的に制御できない限り、16ビットインデックスを使用すると、実際にはすべての書き込みまたは読み取りで読み込み時間が短縮されます。つまり、必要なメモリだけでなく、それを処理するためにどれだけかかるかということです。フレーム間のある時点でバスを介してGPUに移動する必要がある動的バッファーを使用している場合は、可能であれば16ビットのインデックスを使用する必要があります。さらに小さなジオメトリをレンダリングする場合は、単一の16ビットインデックスバッファーに多数のインデックスをバッチ処理して、それらすべてを1回の呼び出しでGPUにコピーできます。

ここでは、新しいATI GPUがどのように機能するかについての情報を見つけることができます。

ATI Stream Developer Training Resources (申し訳ありませんが、正確なドキュメントを見つけることができませんでした)NVidiaについてはあまり読みませんでしたが、多かれ少なかれ同様のアプローチで機能すると思います。


5

長年にわたってメモリとCPUの速度は向上していますが、ゲームは依然としてハードウェアとソフトウェアの限界を押し上げています。そのようなモデルを100個ロードしている場合は、4メガバイトのメモリが節約されます。特定の状況では、できるだけ多くのメモリを節約する価値があります。これで、別のモデルをロードしたり、さらにいくつかの効果音や別の曲を詰め込んだりすることができます。ほとんどのAAAゲームでは、この種の節約は競争よりも優れたものにするために不可欠です。

もちろん、それはすべてゲームに依存するものであり、多くのプロジェクトにとって、それだけの価値はありません。しかし、ハードウェアをできる限りプッシュしたい場合は、できるだけ多くのメモリを節約する方法を見つけたいので、もっとクールなものを追加する余地があります。


4

それは単なるメモリではありません。一部のハードウェアはフラットアウトだけで32ビットインデックスをサポートできず、使用する場合はソフトウェアで頂点パイプラインを実行する必要があります。それはまれになっていますが、それでも偶然遭遇したときに時々厄介な驚きを得ることができます。16ビットインデックスは、一般的に高速に実行することもできます。これは、パフォーマンスのプレッシャーにさらされている場合に重要になる可能性がありますが、16ビットインデックスからの追加のパフォーマンスの利点と、分割が必要になる可能性のあるトレードオフを比較検討する必要があります。すべての状況で正しい答えは1つではないためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.