私はdirectxを学んでいます。それは物事を行う方法に大きな自由を提供しますが、おそらく異なるステートジーは異なるパフォーマンスを発揮し、パフォーマンスの良い使用パターンが何であるかについてのガイダンスはほとんど提供しません.
directx を使用する場合、レンダリングごとに新しいデータの束を複数回スワップする必要があるのは一般的ですか?
最も明白で、おそらく非常に非効率的な使用方法は、次のようになります。
戦略1
レンダリングごとに
モデル 0 (テクスチャを含む) のすべてを読み込み、レンダリングします (IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)
モデル 1 のすべて (テクスチャを含む) を読み込み、レンダリングします (IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)
等...
ロードする最大のものに専用スロットが与えられている場合、部分的にこれをより効率的にできると思います。たとえば、モデル 0 のテクスチャが非常に複雑な場合は、各ステップでそれをリロードせず、スロット 1 にロードしてそのままにしておきます。そこの。もちろん、DX11 の各タイプに確実に存在するレジスタの数がわからないので、これは複雑です (誰かがそれに関するドキュメントを指摘できますか?)
策略2
いくつかのテクスチャ スロットをロード用に選択し、他のものを最も複雑なテクスチャの永久保存用に選択します。
一回だけ
最も複雑なモデル、シェーダー、テクスチャーを永久ストレージ専用のスロットにロード
レンダリングごとに
ロード用に確保したスロットを使用して、モデル 0 にまだ存在しないものをすべてロードしてレンダリングします (IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)。
ロード用に確保したスロットを使用して、モデル 1 にまだ存在しないものをすべてロードしてレンダリングします (IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)。
等...
戦略 3 わかり ませんが、私はこれが初めてなので、上記はおそらくすべて間違っています。
directx (特に DX11) での効率的なレンダリングを可能な限り効率的にするための標準的な戦略は何ですか?