2

の 1 つのピクセルを変更すると便利な状況を簡単に思いつくことができます。特に、すべてのフレームTexture2Dを絶えず実行したり.GetData<>(); SetData<>();RenderTarget2D

単一ピクセルのセッターメソッドを公開しない本当の理由はありますか? そうでない場合、上記の方法を使用せずに単一のピクセルを変更する方法はありますか?

4

1 に答える 1

8

テクスチャ データは、ほとんどの場合、パフォーマンス上の理由から、テクスチャの初期化時にグラフィックス ドライバによってビデオ メモリ (VRAM) にコピーされます。これにより、GPU で実行されているシェーダーによるテクスチャ フェッチが大幅に高速化されます。テクスチャ キャッシュ ミスのたびに失われたデータを PCIe バス経由で取得する必要があるとしたら、絶対に満足できないでしょう。

ただし、お気づきのように、これにより、CPU がデータを読み取ったり変更したりすることが難しくなったり遅くなったりします。PCIe バスが比較的遅いだけでなく、VRAM は通常、CPU によって直接アドレス指定できません。データは通常、特別な低レベル DMA コマンドを使用して転送する必要があります。これがまさに、XNA を使用しているときにパフォーマンス ヒットが見られる理由です。あなたをGetData<>()殺しSetData<>()ているのは関数呼び出しのオーバーヘッドではなく、背後で VRAM にデータをコピーしなければならないという事実です。

VRAM のデータを変更する場合、低レベルのレンダリング API (OpenGL や Direct3D 11 など) には 3 つのオプションがあります。

  1. 変更前にピクセル データを一時的に「マップ」し (メイン メモリにコピーして戻す)、編集が完了したら (変更を VRAM にコミットするために) 「マップ解除」します。これはおそらくGetData<>()SetData<>()が内部で行っていることです。
  2. glTexSubImage2D()基本的に「マップ」ステップをスキップし、新しいピクセル データを VRAM に直接コピーして、以前の内容を上書きする、OpenGL の のような関数を使用します。
  3. レンダー ターゲットとしてテクスチャに書き込むシェーダーを実行することで、ユーザーに代わって変更を行うように GPU に指示します。

XNA は Direct3D の上に構築されているため、これらの制限内でも機能する必要があります。したがって、生のピクセル データは必要ありません。

(余談ですが、上記のすべては GPU バッファー データにも当てはまります。)

于 2012-09-08T04:04:41.910 に答える