C# XNA-同时使用Draw和DrawString时,帧速率会下降

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

我在游戏中有一个棋盘课。该Board类负责绘制许多分区对象,这些对象当前都具有相同的纹理

所以我的绘制调用类似于:Game1.draw调用Board.draw调用Zone.draw为每个Zone对象绘制,它调用Spritebatch.draw

游戏1的绘制方法

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();
    }