これは、参照フレームを取得できるように、現在行われていることの画面です。
私が遭遇している問題は、描画呼び出し中に実行しているテクスチャスワップの量が原因で、ゲームの速度が低下することです。タイルの描画ごとに、壁、キャラクター、床、およびすべてのオブジェクトがそれらのタイプを含むそれぞれのスプライトシート上にあるため、読み込まれたテクスチャは、適切にレイヤー化するためにスプライトを循環して描画するときに、3〜5回以上スワップします。
今、私はすべての一般的なオブジェクトをそれぞれのリストにまとめ、layerDepthを使用してそれらをそのように描画してみましたが、私が直面している新しい問題はドア/ウィンドウの方法に関係しています壁に描かれています。つまり、ステンシルを使用して、ドア/窓の形状で描画された壁のブロックを一掃し、壁が描画されるときにドア/窓のサイズの穴ができるようにしました。
これは、一般的なオブジェクトをグループ化するのではなく、タイルごとに壁に描画を設定する方法です。
- 最初に、ドア/窓がこの壁にあるかどうかを確認します。そうでない場合は、すべての手順をスキップして、通常どおりに描画します。さもないと
- 現在のspriteBatchを終了する
- すでに描画されたものを保持するために、透明色でバッファをクリアします
- ステンシル設定で新しいスプライトバッチを開始する
- ドアエリアを描く
- spriteBatchを終了する
- 以前に設定されたステンシルを考慮した新しいスプライトバッチを開始します
- 穴を開けて描かれる壁を描きます
- そのスプライトバッチを終了
- タイルの描画を続行するには、通常の設定で新しいスプライトバッチを開始します
タイルごとの描画では、どの描画を何の上に描画するかをlayerDepthを使用して整理していないため、深度/ステンシルバッファをクリアすることは重要ではありませんでした。
タイルごとではなく、一般的なオブジェクトのリストから描画しているので、描画呼び出しが大幅に高速化されましたが、ステンシルシステムがドアや窓の領域を隠すための方法を理解できないようです。壁に引き込まれます。問題の根本は、DepthStencilStateを変更するためにspriteBatchを終了すると、現在のRenderTargetがフラットになり、線の下に描画されたものの深度ソートがなくなるということです。つまり、ステンシルはドアや窓のある壁ごとに1回発生する必要があるため、ゲームの世界での奥行きや位置に関係なく、壁は常にすべての上に描画されます。
誰かがこれを回避する方法を知っていますか?簡単に言うと、特定のスプライトの一部をステンシル/マスキングしながら、レイヤーの深さでソートしたものを描画する方法が必要です。