の 1 つのピクセルを変更すると便利な状況を簡単に思いつくことができます。特に、すべてのフレームTexture2D
を絶えず実行したり.GetData<>(); SetData<>();
RenderTarget2D
単一ピクセルのセッターメソッドを公開しない本当の理由はありますか? そうでない場合、上記の方法を使用せずに単一のピクセルを変更する方法はありますか?
テクスチャ データは、ほとんどの場合、パフォーマンス上の理由から、テクスチャの初期化時にグラフィックス ドライバによってビデオ メモリ (VRAM) にコピーされます。これにより、GPU で実行されているシェーダーによるテクスチャ フェッチが大幅に高速化されます。テクスチャ キャッシュ ミスのたびに失われたデータを PCIe バス経由で取得する必要があるとしたら、絶対に満足できないでしょう。
ただし、お気づきのように、これにより、CPU がデータを読み取ったり変更したりすることが難しくなったり遅くなったりします。PCIe バスが比較的遅いだけでなく、VRAM は通常、CPU によって直接アドレス指定できません。データは通常、特別な低レベル DMA コマンドを使用して転送する必要があります。これがまさに、XNA を使用しているときにパフォーマンス ヒットが見られる理由です。あなたをGetData<>()
殺しSetData<>()
ているのは関数呼び出しのオーバーヘッドではなく、背後で VRAM にデータをコピーしなければならないという事実です。
VRAM のデータを変更する場合、低レベルのレンダリング API (OpenGL や Direct3D 11 など) には 3 つのオプションがあります。
GetData<>()
とSetData<>()
が内部で行っていることです。glTexSubImage2D()
基本的に「マップ」ステップをスキップし、新しいピクセル データを VRAM に直接コピーして、以前の内容を上書きする、OpenGL の のような関数を使用します。XNA は Direct3D の上に構築されているため、これらの制限内でも機能する必要があります。したがって、生のピクセル データは必要ありません。
(余談ですが、上記のすべては GPU バッファー データにも当てはまります。)