新纳.如何构建它,以便使用尽可能少的精灵批处理开始/结束语句
本文关键字:精灵 尽可能 批处理 开始 语句 结束语 结束 何构建 构建 新纳 | 更新日期: 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();
在此方案中,整个帧只有一个开始/结束块。