DirectX 10 を使用して 3D アプリケーションをコーディングしていますが、Shadermanagement のタックリングがどうなっているのか疑問に思っています。
アプリケーションの起動時に存在するすべてのシェーダーをプリロードしてから必要に応じて使用するのが最も効果的ですか、それとも数値が高くなった場合にハードウェアのリソースをトレーニングしますか?
また、シェーダー スイッチが最小化されるように、シェーダーごとにレンダリングを注文するのは速度を考慮したものなのだろうかと思います。
DirectX 10 を使用して 3D アプリケーションをコーディングしていますが、Shadermanagement のタックリングがどうなっているのか疑問に思っています。
アプリケーションの起動時に存在するすべてのシェーダーをプリロードしてから必要に応じて使用するのが最も効果的ですか、それとも数値が高くなった場合にハードウェアのリソースをトレーニングしますか?
また、シェーダー スイッチが最小化されるように、シェーダーごとにレンダリングを注文するのは速度を考慮したものなのだろうかと思います。
私は DX10 を使用したことがなく、DX9 のみを使用しましたが、これらのことはまだ同じであると推測しています。
アプリケーションによっては、実際に実行時にシェーダーを生成する場合があります (現在の洗練された 3D ゲームの多くはこれを行っています)。
シェーダーをプリロードすることは悪い考えではありません。シェーダーを生成するかどうか、シェーダーの数、メモリの考慮事項によって異なります。ただし、シェーダーのプリロード (これは、ID3DXEffect インスタンスを作成することを意味すると思います) は、実行時にのみメモリを使用し、CPU を使用しません。
シェーダーごとに注文することをお勧めします。一般に、シェーダーを切り替えるといくらかのオーバーヘッドが発生するため、マテリアルで並べ替えることをお勧めします (過度ではありませんが、アプリの複雑さによっては顕著になります)。
ドローコールの並べ替えについては、 http ://realtimecollisiondetection.net/blog/?p=86 をお読みください。
D3D10では、すべてのデバイスリソースが仮想化されているため、それらが不足することはありません。もちろん、自分がしていることに注意を払わないと、カードの物理的なリソースを使い果たして、多くのスラッシングを引き起こす可能性があります。
さらに、シェーダーを含む状態の切り替えのコストを削減するために、デバイスの状態を大幅に変更しました。
しかし、あなたが本当に求めているのは、「私のアプリケーションでは、メソッドXはメソッドYよりも高速ですか?」です。D3D10は状態管理を簡素化して状態の切り替えを高速化しますが、上記の質問に答える唯一の方法は、アプリケーションとデータを使用してパフォーマンス測定を行うことです。
realtimecollectiondetection.netのブログ投稿は、描画呼び出しの並べ替えについて話しているだけです。これにより、状態の切り替えが少なくなります。状態の切り替えがどれほど高速であるかは関係ありません。それを少なくすると、常に高速になります。ですから、それは良い一般的なアドバイスです。