15

msdnのドキュメントでは、directx 11 では、directx 11 テクスチャをプログラムで塗りつぶす方法が複数あると説明されています。

(1) デフォルトの使用テクスチャでテクスチャを作成し、メモリからのデータで初期化します

(2)動的な使用法でテクスチャを作成し、DeviceContext Mapを使用してテクスチャメモリへのポインタを取得し、それに書き込み、Unmapを使用して完了を示します(その時点でGPUにコピーされたと思います)

(3) ステージングを使用してテクスチャを作成し、動的テクスチャの場合と同じ手順に従いますが、ID3D11DeviceContext.CopyResource を呼び出して、このステージング テクスチャを使用して (不変でない) デフォルトまたは動的テクスチャを塗りつぶします。

ただし、ドキュメントには各方法の長所と短所がまったく説明されておらず、私はまだ directx に慣れていないため、まったく明確ではありません。

directx 11 でプログラムによってテクスチャを作成するこれらの方法のそれぞれの長所と短所は何ですか?

補足:ステージング テクスチャのコンテキストでは、GPU からの読み取りはバッファリングされないため、独自のダブル バッファリングを行う必要があることを読みました。しかし、これが正確かどうか、ステージング テクスチャを使用した書き込みに適用されるかどうか (または、それが実際に何を意味するか) はわかりません。

2 つ目の注意事項: Map メソッドのドキュメントには、サブリソース内のデータへのポインターを取得し、そのサブリソースへの GPU アクセスを拒否すると記載されています。基になるデータが Map によって呼び出されたテクスチャに GPU がアクセスしたい場合、GPU は何をしますか? ストール?(これは私が尋ねた長所と短所の一部のように聞こえるので、私は尋ねます)

4

1 に答える 1

25

正しい答えは、テクスチャを何に使用するかによって異なります。これら 3 つのオプションは、CPU からテクスチャにデータを取得する異なる方法です。これが rendertarget の場合、通常は CPU から初期データを提供していないため、これらを無視できます: テクスチャを作成し、準備が整ったらレンダリングします (おそらく最初に Clear() します)。

したがって、アプリケーション メモリ内にテクスチャに取得するデータがあると仮定すると、次のようになります。

これが単なる静的テクスチャである場合 (つまり、テクスチャが書き込まれるよりもはるかに多くから読み取られることを意味します)、USAGE_DEFAULT または USAGE_IMMUTABLE テクスチャが必要です。これらは通常、USAGE_DYNAMIC と比較して GPU 読み取りパフォーマンス用に最適化されています。テクスチャを作成するときにデータが手元にある場合、オプション (1) が最も簡単で、使用する中間メモリが最も少なく、DX11 では GPU へのデータ転送をレンダリング スレッドとは別のスレッドで実行できます。テクスチャを作成する時点でデータがない場合は、UpdateSubresource() またはオプション (3) を使用してデータを提供します。

動的テクスチャの場合、つまり、CPU から頻繁に新しいコンテンツを提供する場合 (CPU ベースのビデオ再生は標準的なケースです。データはフレームごとに 1 回 CPU によって提供され、フレームごとに 1 回 GPU によって読み取られます)、おそらくUSAGE_DYNAMIC とオプション (2) を使用します。USAGE_DYNAMIC テクスチャは、単に GPU 読み取り用ではなく、CPU から GPU へのデータ ストリーミング用に最適化されています。詳細 (およびパフォーマンスへの影響) はハードウェア ベンダーによって異なりますが、通常は、静的データを事前に読み込む便利な方法であるという理由だけでなく、実際に CPU から GPU にデータをストリーミングする場合にのみ USAGE_DYNAMIC を使用します。

オプション (3) はより特殊化されており、静的テクスチャへの初期データ ロード (多くのテクスチャのデータをロードするためにステージング サーフェスを再利用) または比較的動的に使用するためのデータのストリーミングに使用できます。これにより、GPU/CPU 同期と転送に使用される中間メモリを正確に制御できます。通常、ステージング バッファーのリングと D3D11_MAP_FLAG_DO_NOT_WAIT を使用して、各バッファーが以前の CopyResource によってまだ使用されているかどうかを確認します。これは専門家の選択肢だと思います。注意しないと、CPU と GPU が非同期で実行されなくなり、パフォーマンスが大幅に低下する可能性があります。

完全な開示: 私は Nvidia で D3D ドライバーに取り組んでいますが、これらは私の個人的な意見です。

于 2011-06-30T18:42:50.647 に答える