C# 新华社。如何构建它,以便尽可能少地使用spritebatch开始/结束语句

C# 新华社。如何构建它,以便尽可能少地使用spritebatch开始/结束语句,c#,performance,architecture,xna,spritebatch,C#,Performance,Architecture,Xna,Spritebatch,我在XNA做一个2d游戏。我一开始使用了可拖动的游戏组件,非常高兴。每个精灵都是从可绘制的游戏组件中派生出来的,每个精灵都有自己的开始/结束语句(甚至每个组成墙的瓷砖)。 我在读了一点之后意识到,这是一种不好的表现方式 现在我想知道做这件事的好方法是什么。。。 让我们假设我在游戏中的每个房间 _spritebatch.Begin(SpriteSortMode.Deferred, BlendState.Opaque,

我在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.Draw,例如block

我认为这并不重要,性能也会提高,但是有没有更好的体系结构可以推荐给大家呢

还有,既然代码在上面,有人能对我使用的SpriteBatch.beginparamaters进行评论吗?他们是最快的吗?我所需要的只是转换

我要问的原因是我必须在每个 封锁公共区域,以便Room类可以让他们做自己的事情 _spritebatch.绘图,例如块。\u位置

假设您有许多房间,每个房间中有许多块,可以为每个房间和每个块指定一个public或protected Draw()方法,那么块的所有字段都不需要是public

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)
  }
}
教室
{
…//关于房间的私人字段
...
列表块;
公开无效抽签(游戏时间gt,SpriteBatch sb)
{
某人画(这里是私人房间);
foreach(块中的块b)
b、 抽签(gt、sb)
}
}
然后在游戏课上

//fields section
List<Room> rooms;


    // in the Draw

    spriteBatch.Begin();
      foreach(Room r in rooms)
          r.Draw(gt, spriteBatch);
    spriteBatch.End();
//字段部分
列出会议室名单;
//平局
spriteBatch.Begin();
foreach(房间中的r房间)
r、 绘制(gt、spriteBatch);
spriteBatch.End();

在这个场景中,整个框架只有一个开始/结束块。

对于典型的面向对象体系结构来说,这似乎是一个非常好的问题,感谢!我曾尝试过类似的方法,但效果并不理想。。如果调用后未将spritebatch对象传递给blocks draw函数,则开始它将不起作用。(即使block对象有一个引用同一个spritebatch的字段)…还有一件事,你是否因为某种特殊原因而跳过游戏时间?