SpriteBatch.Begin和.End重复

时间:2013-06-14 12:37:34

标签: xna

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

我还有另一个函数可以迭代绘制函数1000次! 我的问题是,这两行代码会降低性能:

spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
spriteBatch.End();

另一种方法是使用另一个管理绘图功能的类而不重复这两行代码1000次。

3 个答案:

答案 0 :(得分:0)

我建议不要为每次抽奖调用开始和结束。 SpriteBatch将您的绘制调用放入队列中,因此您的绘图代码将被尽可能快地解释(您可以根据深度或纹理对sprite进行排序 - 例如SpriteBatch将执行所有脏工作)。 只有在开始和结束所有2D绘图时,或者当您更改SortMode等时,才应调用Begin和End。

答案 1 :(得分:0)

如果要绘制,只调用spritebatch开始和结束,但如果你绘制的方法在开始和结束块内,那么你不需要它。我建议为你的类制作一个“draw”方法,然后在Game1.Draw方法中你可以调用该方法,而不是在自定义类中调用它。 Game1.Draw是调用spritebatch.begin和end的地方,而不是自定义类。希望这有帮助!

答案 2 :(得分:0)

@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.csBullet.cs的每个实例中,让它们具有以下功能:

public void Draw(SpriteBatch sp)
{ 
    SpriteBatch.Draw(*draw however you want*); 
}

在Level&#39的函数Draw(SpriteBatch sp)中放

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);,而不在spriteBatch.Begin() Draw中调用Game1.cs {1}}