回答:
これについては良いプレゼンテーションがあります。NVIDIAの John McDonaldによる「捨てないでください:効率的なバッファ管理」。これは、様々なトピックをカバーしていますが、あなたの質問をテーマに、一般的なアドバイスは、動的な使用方法や使用してバッファを作成することであるMap()
とのD3D11_MAP_WRITE_DISCARD
データが(すべてのフレーム、またはフレームごとに複数回のように)頻繁に更新する必要があります。これは、定数バッファー、パーティクルシステムの頂点バッファーなどに使用されます。
プレゼンテーションによると、デフォルトの使用量/ UpdateSubresource()
は、動的使用量/よりも多くのCPUオーバーヘッドが発生しますMap()
。ただし、UpdateSubresource()
オープンワールドのゲームでディスクからストリーミングされるデータなど、たまにしか更新する必要がないデータについては、デフォルトの使用法を推奨しています。
そして、はい、使用する場合UpdateSubresource()
は、と組み合わせてではなく、それ自体を使用しMap()
ます。
ID3D11ShaderResourceView * nullsrv = NULL; pCtx->PSSetShaderResources(0, 1, &nullsrv);
スロット0からテクスチャをバインド解除する
それらは、実際の関数呼び出しではなく、リソースを更新する実際の行為を参照している可能性があります。一般に、UpdateSubResourceは、頻繁に更新されないデフォルトのリソース(つまり、すべてのフレームではない)に使用する必要があります。この場合、コマンドバッファーからアクセス可能な一時バッファーにバッファーをコピーする可能性が高くなります(たとえば、競合状態のため)サブリソースを更新することもできます(たとえば、テクスチャ)。
Map / Unmapは、一定のバッファーなど、リソースが非常に頻繁に(つまり、すべてのフレームで)更新される場合に使用する必要があります。最も一般的なケースは、WriteDiscardでバッファ全体を上書きする場合です。彼らがこの慣習を推奨するnVidiaのプレゼンテーションがあります。