如果我有一个显示字体和图像的类,该类包含它自己的具有 SpriteBatch.Being 和 .End 的绘制函数
我还有另一个函数可以迭代绘制函数 1000 次!我的问题是这两行代码会降低性能:
spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
spriteBatch.End();
另一种方法是拥有另一个类来管理绘图功能,而无需重复这 2 行代码 1000 次。
如果我有一个显示字体和图像的类,该类包含它自己的具有 SpriteBatch.Being 和 .End 的绘制函数
我还有另一个函数可以迭代绘制函数 1000 次!我的问题是这两行代码会降低性能:
spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
spriteBatch.End();
另一种方法是拥有另一个类来管理绘图功能,而无需重复这 2 行代码 1000 次。
@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()
Draw
Game1.cs
我不建议在每次抽奖时都调用 Begin 和 End。SpriteBatch 将您的绘图调用放入队列中,因此您的绘图代码将被尽可能快地解释(例如,您可以按精灵的深度或纹理对精灵进行排序 - SpriteBatch 将完成所有脏活)。只有在开始和结束所有 2D 绘图,或更改 SortMode 等时,才应调用 Begin 和 End。
如果要绘制,仅调用 spritebatch begin 和 end,但如果绘制的方法位于 begin 和 end 块内,则不需要它。我建议为您的类创建一个“绘图”方法,然后在 Game1.Draw 方法中调用该方法,而不是在自定义类中调用它。Game1.Draw 是调用 spritebatch.begin 和 end 的地方,而不是在自定义类中。希望这可以帮助!