0

XNAで2Dゲームを作っています。ドローアブル ゲーム コンポーネントの使用から始めて、とても満足しました。すべてのスプライトは drawable-game-component から派生し、それぞれに独自の begin/end ステートメントがあります (壁を構成する各タイルも)。それ以来、少し読んだ後、これはパフォーマンスのために悪い方法であることに気付きました。

今、私はそれを行うための良い方法は何だろうと思っています.私のゲームの各部屋について言ってみましょう...

_spritebatch.Begin(SpriteSortMode.Deferred,
                       BlendState.Opaque,
                     SamplerState.LinearClamp,
                DepthStencilState.Default,
                  RasterizerState.CullNone,
                                  null,
                         _camera.Transform);

for (each block in Blocklist)
{
    _spritebatch.Draw(block._txture,
                      block._position + block._centerVect,
                      block.txtrect, block._color,
               (float)block.txtrot,
                      block._centerVect, 
                          1.0f,
              SpriteEffects.None,
                            0f);
}
_spritebatch.End();

私が尋ねている理由は、各ブロックのフィールドを公開する必要があるためです。これにより、Room クラスは、_spritebatch.Draw などを実行できるようになります。block._position

これは本当に問題ではなく、パフォーマンスが向上すると思いますが、これを行うために推奨できるより良いアーキテクチャはありますか?

また、そのコードがそこにあるので、私が使用している SpriteBatch.Begin パラメータについて誰かコメントできますか? 彼らは最速のものですか?そこに必要なのは変換だけです

4

1 に答える 1

2

私が尋ねている理由は、各ブロックのフィールドを公開する必要があるためです。これにより、Room クラスは、_spritebatch.Draw などを実行できるようになります。block._position

多くの部屋があり、各部屋に多くのブロックがあると仮定すると、各部屋と各ブロックにパブリックまたは保護された Draw() メソッドを与えることができ、ブロックのすべてのフィールドをパブリックにする必要はありません。

class Block
{
  ... // private fields about Block
  ...

  Public void Draw(GameTime gt, SpriteBatch sb)
  {
     sb.Draw(private block fields here);
  }
}

それから部屋のために

class Room
{
  ... // private fields about room
  ...
  List<Block> blocks;

  Public void Draw(GameTime gt, SpriteBatch sb)
  {
     sb.Draw(private room fields here);
     foreach(Block b in blocks)
         b.Draw(gt, sb)
  }
}

その後、メインのゲームクラスで

//fields section
List<Room> rooms;


    // in the Draw

    spriteBatch.Begin();
      foreach(Room r in rooms)
          r.Draw(gt, spriteBatch);
    spriteBatch.End();

このシナリオでは、フレーム全体に対して 1 つの Begin/End ブロックがあります。

于 2013-01-25T15:46:16.557 に答える