0

我在 XNA 中制作 2d 游戏。我开始使用可绘制的游戏组件并且非常高兴。每个精灵都派生自 drawable-game-component 并且每个精灵都有自己的开始/结束语句(甚至每个图块构成一堵墙)。我在读了一点之后意识到这是一种不好的方式来提高性能。

现在我想知道有什么好的方法来做到这一点......让我们说我游戏中的每个房间......

_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 例如。块._位置

我假设这并不重要,性能会提高,但是有没有人可以推荐的更好的架构来做到这一点?

此外,由于该代码在那里,任何人都可以评论我正在使用的 SpriteBatch.Begin 参数吗?他们是最快的吗?我需要的只是变换

4

1 回答 1

2

我要问的原因是我必须公开每个块中的字段负载,以便 Room 类可以让它们执行其 _spritebatch.Draw 例如。块._位置

假设你有很多房间,每个房间里有很多块,你可以给每个房间和每个块一个公共或受保护的 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();

在这种情况下,整个帧只有一个 Begin/End 块。

于 2013-01-25T15:46:16.557 回答