2

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

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

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

另一种方法是拥有另一个类来管理绘图功能,而无需重复这 2 行代码 1000 次。

4

3 回答 3

1

@Daniel G 和 @RaZeR RawByte 有一个观点。但是假设你想在地图上绘制你的(假设是)带有霓虹灯效果的船只,并且所有的子弹都被像素化了。这意味着您将拥有 2 种类型的SpriteBatch.Start(). 最好将这 2 个类分别绘制在它们将被使用的类中(比如说 Level.cs)。你很可能只有 1 个Level.cs.

所以,而不是拥有

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

Ship.cs在and的每个实例中Bullet.cs,让它们具有如下功能:

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

并在 Level 的函数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);而无需调用ofspriteBatch.Begin()DrawGame1.cs

于 2016-04-21T14:25:30.910 回答
0

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

于 2013-06-14T13:19:48.370 回答
0

如果要绘制,仅调用 spritebatch begin 和 end,但如果绘制的方法位于 begin 和 end 块内,则不需要它。我建议为您的类创建一个“绘图”方法,然后在 Game1.Draw 方法中调用该方法,而不是在自定义类中调用它。Game1.Draw 是调用 spritebatch.begin 和 end 的地方,而不是在自定义类中。希望这可以帮助!

于 2016-04-21T12:11:13.560 回答