XNA - 一起使用Draw和DrawString时帧速率下降

时间:2014-02-08 17:10:55

标签: c# xna

我的游戏中有一个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似乎是如此昂贵?

请编辑或询问问题是否不明确。

提前致谢。

1 个答案:

答案 0 :(得分:1)

你散布Draw()DrawString()的事实有点像红鲱鱼;这里的相关事实是你反复交换纹理

您的区域对象全部在一个纹理上。因此,当您首先绘制所有区域,然后绘制所有字符串时,这就是视频驱动程序中发生的情况:

  1. 好的,我们即将使用zoneTexture绘制多边形。设置我们的设备状态。
  2. 绘制所有区域多边形。
  3. 现在我们将使用fontTexture绘制多边形。设置我们的设备状态。
  4. 绘制所有字符串多边形。
  5. 完成。
  6. 另一方面,当您将文本与区域一起散布时,它看起来更像是:

    1. 好的,我们即将使用zoneTexture绘制多边形。设置我们的设备状态。
    2. 绘制第1区的多边形。
    3. 等一下,我们必须使用fontTexture绘制一些文字。设置我们的设备状态。
    4. 为区域1的文本绘制多边形。
    5. 好的,我们仍然可以使用zoneTexture绘制更多区域。设置我们的设备状态。
    6. 绘制第2区的多边形。
    7. 哎呀,第2区也有使用fontTexture的文字。设置我们的设备状态。
    8. 为区域2绘制文本的多边形。
    9. 好的,使用zoneTexture的下一个区域的时间。设置我们的设备状态。
    10. 然后继续......以及......
    11. 正如您所看到的,散布Draw()调用需要不同设备状态的调用会迫使图形驱动程序执行更多工作!这就是为什么你看到FPS下降的原因。