新纳.如何构建它,以便使用尽可能少的精灵批处理开始/结束语句

本文关键字:精灵 尽可能 批处理 开始 语句 结束语 结束 何构建 构建 新纳 | 更新日期: 2023-09-27 17:56:13

我在XNA中制作2D游戏。我开始使用可绘制的游戏组件,并且非常高兴。每个精灵都派生自可绘制的游戏组件,每个精灵都有自己的开始/结束语句(甚至每个图块组成一堵墙)。自从我阅读了一会儿后意识到这是一种糟糕的性能方法。

现在我想知道什么是好方法...假设对于我游戏中的每个房间,我都做...

_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。画例如。block._position

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

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

新纳.如何构建它,以便使用尽可能少的精灵批处理开始/结束语句

问的原因是我必须在每个字段中加载字段 阻止公共,以便 Room 类可以让他们做 _spritebatch。画例如。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();

在此方案中,整个帧只有一个开始/结束块。