C# XNA-同时使用Draw和DrawString时,帧速率会下降
我在游戏中有一个棋盘课。该Board类负责绘制许多分区对象,这些对象当前都具有相同的纹理 所以我的绘制调用类似于:Game1.draw调用Board.draw调用Zone.draw为每个Zone对象绘制,它调用Spritebatch.draw 游戏1的绘制方法C# XNA-同时使用Draw和DrawString时,帧速率会下降,c#,xna,C#,Xna,我在游戏中有一个棋盘课。该Board类负责绘制许多分区对象,这些对象当前都具有相同的纹理 所以我的绘制调用类似于:Game1.draw调用Board.draw调用Zone.draw为每个Zone对象绘制,它调用Spritebatch.draw 游戏1的绘制方法 protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(SpriteS
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.Draw)
一切正常,直到我开始画线。取消对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);
}
}
}
}
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,这听起来与我的直觉背道而驰
知道为什么要这样做吗?为什么在抽签后立即调用DrawString似乎成本如此高昂
如果问题不清楚,请编辑或查询
提前谢谢。你在
Draw()
和DrawString()之间穿插Draw()
这一事实有点让人费解;与此相关的事实是,您正在反复交换纹理
分区对象都位于一个纹理上。因此,当您首先绘制所有区域,然后绘制所有字符串时,视频驱动程序中会发生以下情况:
好的,我们将使用zoneTexture
绘制多边形。设置我们的设备状态
绘制所有分区多边形
现在我们将使用fontTexture
绘制多边形。设置我们的设备状态
绘制所有的字符串多边形
完成了
另一方面,当你把你的文本和你的区域混在一起时,它看起来更像这样:
好的,我们将使用zoneTexture
绘制多边形。设置我们的设备状态
绘制分区1的多边形
等等,我们必须使用fontTexture
绘制一些文本。设置我们的设备状态
为分区1的文本绘制多边形
好的,我们还可以使用zoneTexture
绘制更多的区域。设置我们的设备状态
绘制分区2的多边形
哎呀,区域2也有使用fontTexture
的文本。设置我们的设备状态
为分区2的文本绘制多边形
好的,使用zoneTexture
进入下一个区域的时间。设置我们的设备状态
不停地,不停地,不停地
正如您所看到的,插入需要不同设备状态的Draw()
调用会迫使图形驱动程序做更多的工作!这就是为什么你看到FPS下降的原因。啊,我明白了!我不是那样看的!我不认为文字是一种纹理。现在完全有道理了。非常感谢。读到视频司机的对话,我真的笑了:D再次感谢!
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);
}
}
}
}
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();
}