9

私はdirectxを学んでいます。それは物事を行う方法に大きな自由を提供しますが、おそらく異なるステートジーは異なるパフォーマンスを発揮し、パフォーマンスの良い使用パターンが何であるかについてのガイダンスはほとんど提供しません.

directx を使用する場合、レンダリングごとに新しいデータの束を複数回スワップする必要があるのは一般的ですか?

最も明白で、おそらく非常に非効率的な使用方法は、次のようになります。

戦略1

レンダリングごとに

  1. モデル 0 (テクスチャを含む) のすべてを読み込み、レンダリングします (IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)

  2. モデル 1 のすべて (テクスチャを含む) を読み込み、レンダリングします (IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)

  3. 等...

ロードする最大のものに専用スロットが与えられている場合、部分的にこれをより効率的にできると思います。たとえば、モデル 0 のテクスチャが非常に複雑な場合は、各ステップでそれをリロードせず、スロット 1 にロードしてそのままにしておきます。そこの。もちろん、DX11 の各タイプに確実に存在するレジスタの数がわからないので、これは複雑です (誰かがそれに関するドキュメントを指摘できますか?)

策略2

いくつかのテクスチャ スロットをロード用に選択し、他のものを最も複雑なテクスチャの永久保存用に選択します。

一回だけ

最も複雑なモデル、シェーダー、テクスチャーを永久ストレージ専用のスロットにロード

レンダリングごとに

  1. ロード用に確保したスロットを使用して、モデル 0 にまだ存在しないものをすべてロードしてレンダリングします (IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)。

  2. ロード用に確保したスロットを使用して、モデル 1 にまだ存在しないものをすべてロードしてレンダリングします (IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)。

  3. 等...

戦略 3 わかり ませんが、私はこれが初めてなので、上記はおそらくすべて間違っています。

directx (特に DX11) での効率的なレンダリングを可能な限り効率的にするための標準的な戦略は何ですか?

4

2 に答える 2

2

DirectX はリソースを管理し、パフォーマンスを最適化するためにできる限りビデオ メモリに保持しようとしますが、カードのビデオ メモリの限界までしか保持できません。リソースがまだビデオ メモリ内にある場合でも、状態が変化するたびにオーバーヘッドが発生します。

これを最適化するための一般的な戦略は、レンダリング パス中の状態変更の数を最小限に抑えることです。通常、これは、同じテクスチャを使用するすべてのポリゴンをバッチで描画し、同じ頂点バッファーを使用するすべてのオブジェクトをバッチで描画することを意味します。したがって、通常は、状態を変更してより多くのプリミティブを描画する前に、できるだけ多くのプリミティブを描画しようとします。

これにより、レンダリング コードが少し複雑になり、保守が難しくなることが多いため、プロファイリングを行って、最適化をどの程度行うかを決定する必要があります。

一般に、この質問の範囲を超えてより一般的なアルゴリズムを変更することで、パフォーマンスが向上します。いくつかの例は、遠くのオブジェクトとオクルージョン クエリのポリゴン数を減らすことです。よくある真言は、「最速のポリゴンは、描画しないポリゴンです」です。いくつかの簡単なリンクを次に示します。

http://msdn.microsoft.com/en-us/library/bb147263%28v=vs.85%29.aspx

http://www.gamasutra.com/view/feature/3243/optimizing_direct3d_applications_.php

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter06.html

于 2011-06-21T23:54:57.617 に答える
1

他の回答は、質問自体に対するより良い回答ですが、尋ねた後に私が見つけた最も関連性の高いものは、 gamedev.netでのこの議論であり、いくつかの大きなタイトルのゲームが状態の変化と描画呼び出しについてプロファイルされています。

そこから生まれるのは、有名なゲームは実際にはこれについてあまり心配していないようだということです。つまり、この種の問題に対処するコードを書くのにかなりの時間がかかる可能性があり、コードを書くのに時間がかかる可能性があります。アプリケーションを完成させるために失われた時間の価値はありません。

于 2011-06-22T15:35:07.437 に答える