如何在屏幕上显示/显示 FPS

本文关键字:显示 FPS 屏幕 | 更新日期: 2023-09-27 18:36:10

我有这个代码示例,我需要找到如何在屏幕上显示/显示每秒帧数。尝试使用该类,但它不能正常工作,我不知道如何使用它。

protected override void Initialize()
{
    base.Initialize();
    fpsm = new FpsMonitor();
    fpsm.Update();
    fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);
}
protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
        ButtonState.Pressed)
        this.Exit();
    modelRotation += (float)gameTime.ElapsedGameTime.TotalMilliseconds *
        MathHelper.ToRadians(0.1f);
    base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    // Copy any parent transforms.
    Matrix[] transforms = new Matrix[myModel.Bones.Count];
    myModel.CopyAbsoluteBoneTransformsTo(transforms);
    // Draw the model. A model can have multiple meshes, so loop.
    foreach (ModelMesh mesh in myModel.Meshes)
    {
        // This is where the mesh orientation is set, as well 
        // as our camera and projection.
        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();
            effect.World = transforms[mesh.ParentBone.Index] *
                Matrix.CreateRotationY(modelRotation)
                * Matrix.CreateTranslation(modelPosition);
            effect.View = Matrix.CreateLookAt(cameraPosition,
                Vector3.Zero, Vector3.Up);
            effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                MathHelper.ToRadians(45.0f), aspectRatio,
                1.0f, 10000.0f);
        }
        // Draw the mesh, using the effects set above.
        mesh.Draw();
    }
    base.Draw(gameTime);
}

和 FPS 类:

public class FpsMonitor
{
    public float Value { get; private set; }
    public TimeSpan Sample { get; set; }
    private Stopwatch sw;
    private int Frames;
    public FpsMonitor()
    {
        this.Sample = TimeSpan.FromSeconds(1);
        this.Value = 0;
        this.Frames = 0;
        this.sw = Stopwatch.StartNew();
    }
    public void Update()
    {
        if (sw.Elapsed > Sample)
        {
            this.Value = (float)(Frames / sw.Elapsed.TotalSeconds);
            this.sw.Reset();
            this.sw.Start();
            this.Frames = 0;
        }
    }
    public void Draw(SpriteBatch SpriteBatch, SpriteFont Font, Vector2 Location, Color Color)
    {
        this.Frames++;
        SpriteBatch.DrawString(Font, "FPS: " + this.Value.ToString(), Location, Color);
    }
}

我在 Game1 中尝试.cs在构造函数中使用它:

fpsm = new FpsMonitor();
fpsm.Update();
fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);

但这不是如何使用它。我如何使用它以及在我的代码中的位置?

如何在屏幕上显示/显示 FPS

从我所看到的

fpsm = new FpsMonitor(); // in constructor
fpsm.Update();// in update I think first line
spriteBatch.Begin();  // in draw Last lines probably even after base.Draw(gameTime);
fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);
spriteBatch.End();

这应该像一个魅力

[编辑精灵字体说明]

您将需要创建一个精灵字体。为此,右键单击"内容"选择"添加新项"并创建精灵字体。它是一个 XML 文件,将在编译时进行转换。您可以更改字体和高度,我建议Arial和10....你总是可以改变这一点。

接下来,您需要加载它。我通常这样做。

在课堂上

private Spritefont Arial10;

在加载内容中

Arial10 = Content.Load<Spritefont>("Arial10");

现在你可以这样做了

spriteBatch.Begin();  // in draw Last lines probably even after base.Draw(gameTime);
fpsm.Draw(spriteBatch, Arial10 , new Vector2(5,5), Color.Red);
spriteBatch.End();

不能在初始化方法中绘制 FPS。您需要在 Draw 方法中绘制,并在 Update 方法中进行更新。如果未在 Draw 方法上绘制,则 FPS 将永远不会绘制。初始化只被调用一次,并且您的图形设备每帧都会被清除。

Initialize方法的Game1.cs范围内,删除以下行:

fpsm.Update();
fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);

fpsm.Update();添加到 Update() 方法,并将其添加到 Game1 中的Draw方法.cs(GraphicsDevice.Clear(Color.CornflowerBlue); 之后):

spriteBatch.Begin();
fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);
spriteBatch.End();

我很确定这是你需要做的。

不要忘记通过以下方式在LoadContent()方法中加载字体:

fonts = Content.Load<SpriteFont>("MySpriteFont");

此外,精灵字体需要是内容项目中的编译文件!只需右键单击内容项目,选择"添加新项>然后选择一个 SpriteFont 文件。