Xna SpriteBatch.开始和结束复制

Xna SpriteBatch.开始和结束复制,xna,Xna,如果我有一个类,它显示字体和图像,其中包含自己的绘图函数,该函数具有SpriteBatch.Being和.End 我还有另一个函数,它将draw函数迭代1000次! 我的问题是这两行代码是否会降低性能: spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend); spriteBatch.End(); 另一种方法是使用另一个类来管理draw函数,而无需重复这两行代码1000次。我不建议每次draw调用都调用Begin

如果我有一个类,它显示字体和图像,其中包含自己的绘图函数,该函数具有SpriteBatch.Being和.End

我还有另一个函数,它将draw函数迭代1000次! 我的问题是这两行代码是否会降低性能:

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调用越少,性能越好。