0

質問は2D固有です。

私は、レイヤーの 1 つのレンダー ターゲットであるテクスチャを常に更新しています。更新はテクスチャ全体の再描画であり、スプライトの描画とテキストの出力によって実行されます。この操作は頻繁に実行され、大量の CPU を消費します。もちろん、それを抑えるために再描画の回数を最適化しました。

これらの操作を Direct3D でバッファリングする方法はありますか? 現在、スプライト/テキスト操作のチェーンを繰り返し構築する必要があるためです。ワールド アップデートを実行するゲームを想定してみましょう。この退屈な作業をどのように克服するのでしょうか? たぶん、より多くのレイヤーを作成することによってですか?

私にとって最善の方法は、変更可能なドロー チェーン オブジェクトを作成することですが、Direct3D ではこのようなものは見つかりませんでした。

4

1 に答える 1

1

検討できる一般的な方法がいくつかあります。

  • バッチ処理: 描画を順序付けて結合し、可能な限り少ない呼び出しを実行し、状態変化の間にできるだけ多くのオブジェクトを描画します。
  • キャッシュ: できるだけ多くのジオメトリを頂点バッファーに保持します。2D では、ほとんどのものがテクスチャ付きのクワッドであるため、これはさらに興味深いものになります。その場合...
  • シェーダー: クワッドの X/Y 位置/サイズを指定する float4 を使用する頂点シェーダーを作成し、それを使用して 4 つの頂点を描画することができる場合があります。マトリックスの状態を完全に変更する必要はありません。シェーダーで 4 つのフロートを更新するだけです (すべてのビュー計算をスキップし、メモリと計算を 75% 削減します)。シェーダーで正しい設定が使用されていることを確認するには、...
  • 状態ブロック: すべての色、モード、およびシェーダーがバインドされた、スプライトの各タイプの状態ブロックを保存します。次に、状態ブロックを適用し、テクスチャをバインドし、座標を設定して、描画するだけです。せいぜい、各スプライトを 4 つの呼び出しに減らすことができます。それでも...
  • Cull: 何も描かないのが一番です。単純なスクリーン境界チェック (他の方法で行われるポリゴンごとのカリングよりも高速になる可能性があります) を実行できる場合は、並べ替えと基本的なオクルージョン (透明度のあるフラグ スプライト) を実行できます。2D では、ほとんどのカリング チェックは非常に安価です。可能な限り、並べ替え、切り取り、選別します。

実際のバッファリングに関しては、ドライバーが適切なタイミングと場所でそれを処理します。状態ブロックは、すべてのモードを 1 回の呼び出しで提供することにより、バッファリングに影響を与えることができます (有益であると信じていますが、それが良いか悪いかは忘れました)。次への呼び出しを削減します。

if (sprite.Visible && Active(sprite) && OnScreen(sprite))
{
    states[sprite.Type]->Apply(); 
    device->BindTexture(sprite.Texture); 
    device->SetVertexShaderF(sprite.PositionSize); 
    device->Draw(quad);
}

CPUの使用に役立つ可能性が非常に高いです。

于 2011-12-30T23:49:24.307 に答える