【问题标题】:XNA - weird frame rate drop when using Draw and DrawString togetherXNA - 一起使用 Draw 和 DrawString 时出现奇怪的帧率下降
【发布时间】:2014-02-09 22:48:04
【问题描述】:

我的游戏中有一个棋盘类。这个 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类中的Draw方法(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's 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 似乎如此昂贵?

如果问题不清楚,请编辑或询问。

提前致谢。

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    您将Draw() 与DrawString() 穿插在一起的事实有点牵强附会;这里的相关事实是您反复交换纹理。

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

    1. 好的,我们即将使用zoneTexture 绘制多边形。设置我们的设备状态。
    2. 绘制所有区域多边形。
    3. 现在我们将使用fontTexture 绘制多边形。设置我们的设备状态。
    4. 绘制所有的字符串多边形。
    5. 完成。

    另一方面,当您在区域中穿插文本时,它看起来更像这样:

    1. 好的,我们即将使用zoneTexture 绘制多边形。设置我们的设备状态。
    2. 为区域 1 绘制多边形。
    3. 等等,我们必须使用fontTexture 绘制一些文本。设置我们的设备状态。
    4. 为区域 1 的文本绘制多边形。
    5. 好的,我们还有更多区域可以使用zoneTexture 绘制。设置我们的设备状态。
    6. 为区域 2 绘制多边形。
    7. 糟糕,第 2 区也有使用 fontTexture 的文本。设置我们的设备状态。
    8. 为区域 2 的文本绘制多边形。
    9. 好的,下一个区域的时间使用zoneTexture。设置我们的设备状态。
    10. 不断,不断,不断......

    如您所见,穿插需要不同设备状态的 Draw() 调用会迫使图形驱动程序做更多的工作!所以这就是你看到 FPS 下降的原因。

    【讨论】:

    • 啊啊啊我明白了!我没这么看!我不认为文本是一种纹理。现在完全有道理。谢谢你。看到视频司机的谈话,我真的笑了:D 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多