Xna SpriteBatch.开始和结束复制
如果我有一个类,它显示字体和图像,其中包含自己的绘图函数,该函数具有SpriteBatch.Being和.End 我还有另一个函数,它将draw函数迭代1000次! 我的问题是这两行代码是否会降低性能:Xna SpriteBatch.开始和结束复制,xna,Xna,如果我有一个类,它显示字体和图像,其中包含自己的绘图函数,该函数具有SpriteBatch.Being和.End 我还有另一个函数,它将draw函数迭代1000次! 我的问题是这两行代码是否会降低性能: spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend); spriteBatch.End(); 另一种方法是使用另一个类来管理draw函数,而无需重复这两行代码1000次。我不建议每次draw调用都调用Begin
spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
spriteBatch.End();
另一种方法是使用另一个类来管理draw函数,而无需重复这两行代码1000次。我不建议每次draw调用都调用Begin和End。SpriteBatch将绘图调用放入队列中,以便尽可能快地解释绘图代码(例如,您可以按深度或纹理对精灵进行排序-SpriteBatch将完成所有脏活)。
只有在开始和结束所有二维图形时,或者在更改SortMode等时,才应调用Begin和End。如果要绘制,则仅调用spritebatch Begin和End,但如果绘制的方法位于Begin和End块内,则不需要它。我建议为您的类创建一个“draw”方法,然后在Game1.draw方法中您可以调用该方法,而不是在自定义类中调用它。Game1.Draw是调用spritebatch.begin和end的地方,而不是在自定义类中。希望这有帮助 @Daniel G和@RaZeR RawByte有道理。但假设你想用霓虹灯效果在地图上画你的(假设)飞船,所有的子弹都是像素化的。这意味着您将有两种类型的
SpriteBatch.Start()
。最好在将要使用的类中分别绘制这两个类(比如Level.cs)。您很可能只有一个Level.cs
因此,与其
public void Draw(SpriteBatch sp)
{
SpriteBatch.Begin(*whatever effect you want*);
SpriteBatch.Draw(*draw however you want*);
SpriteBatch.End();
}
在Ship.cs
和Bullet.cs
的每个实例中,让它们具有如下功能:
public void Draw(SpriteBatch sp)
{
SpriteBatch.Draw(*draw however you want*);
}
在关卡的功能中Draw(SpriteBatch sp)
put
public void Draw(SpriteBatch sp)
{
// Draw all ships
SpriteBatch.Begin(*whatever effects you want for ships*);
foreach(Ship s in shipList)
s.Draw(sp);
SpriteBatch.End();
// Draw all bullets
SpriteBatch.Begin(*whatever effects you want for bullets*);
foreach(Bullet b in bulletList)
b.Draw(sp);
SpriteBatch.End();
}
在
Game1.cs
中,绘制级别时,只需向其发送spriteBatch
变量,如下所示:myLevel.Draw(spriteBatch)
,而不调用Game1.cs
的Draw
中的spriteBatch.Begin()
,我总是让另一个类处理它,一次只调用这两行。但是其他人可能能够更好地了解这两条线在引擎盖下的作用,但我预测不重复它们将是理想的。想想SpriteBatch。开始是创建要绘制的Sprite集合(一批)的过程的开始。每次你调用SpriteBatch.Draw时,它不会在那个时候绘制它,它只是将它添加到你正在制作的集合中。当您最终调用SpriteBatch.End时,就像告诉Xna“好的,我已经完成添加到该集合的操作,将所有这些精灵发送到GPU并在一个流中绘制它们”。因此,是的,SB.Begin/SB.End调用越少,性能越好。