UpdateSubresourceとMap / Unmapの使い方は?


8

私が理解したこと(さまざまなページを読んだこと)から、バッファを更新する方法は2つあります。

  1. UpdateSubresource()DEFAULT使用法でバッファが作成された場合)
  2. Map()、新しいデータをコピーしますUnmap()DYNAMIC使用法でバッファが作成された場合)

最初のケースでは、この1つの関数のみを呼び出しますか?バッファをマップしてからサブリソースを更新すると人々が言うのを見たことがあるので、あるいは私はそれらを誤解しているかもしれません。

また、他に方法はありますか(疑わしいです:P)?私は物事を正しく理解していますか?

回答:


11

これについては良いプレゼンテーションがあります。NVIDIAの John McDonaldによる「捨てないでください:効率的なバッファ管理」。これは、様々なトピックをカバーしていますが、あなたの質問をテーマに、一般的なアドバイスは、動的な使用方法や使用してバッファを作成することであるMap()とのD3D11_MAP_WRITE_DISCARDデータが(すべてのフレーム、またはフレームごとに複数回のように)頻繁に更新する必要があります。これは、定数バッファー、パーティクルシステムの頂点バッファーなどに使用されます。

プレゼンテーションによると、デフォルトの使用量/ UpdateSubresource()は、動的使用量/よりも多くのCPUオーバーヘッドが発生しますMap()。ただし、UpdateSubresource()オープンワールドのゲームでディスクからストリーミングされるデータなど、たまにしか更新する必要がないデータについては、デフォルトの使用法を推奨しています。

そして、はい、使用する場合UpdateSubresource()は、と組み合わせてではなく、それ自体を使用しMap()ます。


2
不思議なことに、あなたは両方とも同じ分で応答し、同じリンクを投稿しました。
NPS 2013

他のスレッドでは、「UpdateSubresourceで更新するためにバッファをバインドする必要はありません。実際、更新時にバインドする必要はありません」と書いています。これは、すべてのバッファを更新する前に常にバインドを解除する必要があることを意味しますか?もしそうなら、どうすればバッファをアンバインドできますか?
NPS 2013

1
@NPSまず第一に、あなたがその場所で何か他のものをすでにバインドしている場合、それは暗黙のうちにバインド解除されます。それ以外の場合は、明示的にNULLをバインドしてバッファをバインド解除できます。たとえば、あなたが行うことができますID3D11ShaderResourceView * nullsrv = NULL; pCtx->PSSetShaderResources(0, 1, &nullsrv);スロット0からテクスチャをバインド解除する
ネイサン・リード

私は暗黙的なものを知っていましたが、明示的なもの、thxが必要でした。しかし、あなたは私の最初の質問に答えませんでした-私が更新するつもりだったすべてのバッファに対して常にこれをしなければならないのですか?
NPS 2013

1
@NPS理想的には、CPUでバッファーを更新するときに、バッファーがGPUによって使用されてはなりません。ただし、GPUとCPUは非同期で実行されるため、これを確認するのは簡単ではありません。実際のパフォーマンスの問題でない限り、心配する必要はありません。
ネイサンリード

2

それらは、実際の関数呼び出しではなく、リソースを更新する実際の行為を参照している可能性があります。一般に、UpdateSubResourceは、頻繁に更新されないデフォルトのリソース(つまり、すべてのフレームではない)に使用する必要があります。この場合、コマンドバッファーからアクセス可能な一時バッファーにバッファーをコピーする可能性が高くなります(たとえば、競合状態のため)サブリソースを更新することもできます(たとえば、テクスチャ)。

Map / Unmapは、一定のバッファーなど、リソースが非常に頻繁に(つまり、すべてのフレームで)更新される場合に使用する必要があります。最も一般的なケースは、WriteDiscardでバッファ全体を上書きする場合です。彼らがこの慣習を推奨するnVidiaのプレゼンテーションがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.