我的游戏中有一个Board类。此Board类负责绘制许多Zone对象,这些对象当前都具有相同的纹理。
所以我的绘制调用如下:Game1.Draw调用Board.Draw为每个区域对象调用Zone.Draw,调用Spritebatch.Draw
Game1的绘制方法
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, cam.Transform);
board.Draw(gameTime);
spriteBatch.End();
}
在Board类(Board.Draw)中绘制方法
public void Draw(GameTime gameTime)
{
if (zones != null)
{
for (int x = 1; x < xbound-1; x++)
{
for (int y = 1; y < ybound-1; y++)
{
zones[x, y].Draw(gameTime);
}
}
}
}
在区域(Zone.Draw)中绘制方法
public void Draw(GameTime gameTime)
{
if (Tile != null)
{
Game1.spriteBatch.Draw(Tile, new Rectangle((int)pos.X, (int)pos.Y, size, size), Color.White);
//Game1.spriteBatch.DrawString(font2, pos.X.ToString() + "," + pos.Y.ToString(), pos, Color.Blue);
}
}
在我开始绘制字符串之前,一切正常。取消注释DrawString调用会导致灾难性的FPS从一致的60降至20-25。
但这是奇怪的部分。我创建了一种不同的方法来绘制字符串,而不是在Zone的Draw中进行。我在Board.Draw完成绘制区域后调用了这个方法。
绘制字符串的新单独方法
public void DrawNumbers(GameTime gameTime)
{
if (zones != null)
{
for (int x = 1; x < xbound - 1; x++)
{
for (int y = 1; y < ybound - 1; y++)
{
Game1.spriteBatch.DrawString(font2, x.ToString() + "," + y.ToString(), zones[x, y].getPos(), Color.Blue);
}
}
}
}
现在Game1的Draw看起来像这样
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, cam.Transform);
board.Draw(gameTime);
spriteBatch.End();
spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, cam.Transform);
board.DrawNumbers(gameTime);
spriteBatch.End();
}
这样做不会影响性能!我再次得到60FPS,这对我来说听起来很直观......
知道为什么要这样做吗?为什么在Draw调用之后调用DrawString似乎是如此昂贵?
请编辑或询问问题是否不明确。
提前致谢。
答案 0 :(得分:1)
你散布Draw()
和DrawString()
的事实有点像红鲱鱼;这里的相关事实是你反复交换纹理。
您的区域对象全部在一个纹理上。因此,当您首先绘制所有区域,然后绘制所有字符串时,这就是视频驱动程序中发生的情况:
zoneTexture
绘制多边形。设置我们的设备状态。fontTexture
绘制多边形。设置我们的设备状态。另一方面,当您将文本与区域一起散布时,它看起来更像是:
zoneTexture
绘制多边形。设置我们的设备状态。fontTexture
绘制一些文字。设置我们的设备状态。zoneTexture
绘制更多区域。设置我们的设备状态。fontTexture
的文字。设置我们的设备状态。zoneTexture
的下一个区域的时间。设置我们的设备状态。正如您所看到的,散布Draw()
调用需要不同设备状态的调用会迫使图形驱动程序执行更多工作!这就是为什么你看到FPS下降的原因。