交換効果の実際的なコスト


16

私は自分のプロジェクトにXNAを使用しており、それらのフォーラムでは、メッシュのエフェクトを交換するとコストが比較的高いという事実に言及していることがあります。 GPUに適切なパラメーターとともに。

誰かがこのプロセスについて費用がかかるものを正確に説明できるかどうか疑問に思いましたか?そして、可能であれば、「比較的」コンテキストに入れますか?

たとえば、ピッキングを支援するために短いシェーダーを使用したい場合、次のようにします。

  1. すべてのオブジェクトの効果を変更し、一意の色を計算して識別し、シェーダーに提供します。
  2. すべてのオブジェクトをメモリ内のレンダーターゲットに描画します。
  3. ターゲットから色を取得し、それを使用して選択したオブジェクトを検索します。

そのプロセスを完了するのにかかる合計時間のどの部分がシェーダーの交換に費やされるでしょうか?私の本能は、シェーダーがどれほど単純であっても、シーンを再びレンダリングすることは、プロセスの他の部分よりも桁違いに遅いと言うでしょう。

回答:


21

あなたが説明している問題は「特別な」問題ではありません。GPUのエフェクトを変更することに関して特に遅いことはありません。エフェクト、エフェクトパラメーター(変換を含む)、テクスチャ、さまざまなレンダリング状態の変更、および複数の描画コマンドの送信に関する問題は、別のバッチをGPUに送信する必要があることです。

バッチはCPUにバインドされており、使用するフレームごとに数千*しか取得できません。

CPUと実行している他の作業に依存しますが、フレームごとに約1000バッチを取得するとしましょう。バッチごとに1つのオブジェクトをレンダリングする場合、問題が発生する前に画面に約1000個のオブジェクトを描画できます。

突然ピッキングを追加し、すべてのオブジェクトを2回レンダリングする必要がある場合、描画できるオブジェクトは500個に制限されます。

(したがって、オブジェクトの数が少ない場合は、心配しないでください!)

使用しているバッチの数を減らすには、基本的に「賢く」する必要があります。これを行うための典型的な方法は、複数のオブジェクトを1つのバッチに巧妙に結合することです。特に、「インスタンス化」を調べます。おそらく、インスタンス番号を使用して、シェーダー内の各オブジェクトに一意の色を割り当てることができます。

特にピッキングに適した別の手法は、ソフトウェアでレンダリングされたオブジェクトをカリングして、ピッキングされたピクセルに触れていないことがわかっているものをレンダリングしないようにすることです。

「バッチ、バッチ、バッチ:本当の意味は?」というタイトルのNVidiaのプレゼンテーションスライドデッキ全体を次に示します。(PDF)これには、これを説明する素敵なグラフなどがあります。また、バッチ数を減らすためのいくつかのテクニックもリストしています。


同意した!説明と提案をありがとう、私が読んだことは今ではもっと理にかなっている。NVidiaのプレゼンテーションにも感謝します。今読んでいるだけでとても助かります。
sebf

1
「バッチ、バッチ、バッチ」ペーパーへのリンクを更新:ce.u-sys.org/Veranstaltungen/…–
Marton

1
おかげでマートン、新しいリンクを投稿に編集しました:)
アンドリューラッセル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.