gpt4 book ai didi

xna - 如何在XNA中正确计算FPS?

转载 作者:行者123 更新时间:2023-12-02 20:53:33 24 4
gpt4 key购买 nike

我编写了一个组件来显示当前的 FPS。
其中最重要的部分是:

    public override void Update(GameTime gameTime)
{
elapseTime += (float)gameTime.ElapsedRealTime.TotalSeconds;
frameCounter++;

if (elapseTime > 1)
{
FPS = frameCounter;
frameCounter = 0;
elapseTime = 0;
}
base.Update(gameTime);
}


public override void Draw(GameTime gameTime)
{
spriteBatch.Begin();

spriteBatch.DrawString(font, "FPS " + ((int)FPS).ToString(), position, color, 0, origin, scale, SpriteEffects.None, 0);

spriteBatch.End();

base.Draw(gameTime);
}

大多数情况下都可以正常工作,但最近我遇到了问题。
当我将以下代码放入游戏的 Update 方法中时,奇怪的事情开始发生。

       if (threadPath == null || threadPath.ThreadState != ThreadState.Running)
{
ThreadStart ts = new ThreadStart(current.PathFinder.FindPaths);
threadPath = new Thread(ts);
threadPath.Priority = ThreadPriority.Highest;
threadPath.Start();
}

这段代码的主要思想是始终在不同的线程中运行寻路算法。

我所说的奇怪的事情是指有时 FPS 急剧下降,这是显而易见的,但显示的 FPS 变化的频率超过每秒一次。如果我理解这段代码,FPS 的变化频率不会超过每秒一次。

谁能给我解释一下这是怎么回事吗?

编辑2010年3月26日
我还发布了 Draw 方法的代码。

编辑 2010 年 3 月 31 日对 Venesectrix 问题的回答
1) 您是以固定时间步长还是可变时间步长运行?
IsFixedTimeStep 和 SynchronizeWithVerticalRetrace 设置为 true。
2)发生这种情况时您是否移动了 XNA 窗口?

3)XNA 窗口有焦点吗?
是的
4)它有多引人注目(即更新速度太快以至于你无法阅读,或者更新时间几乎不超过一秒)?
我能够读取更新,FPS 每秒更新约 3 次。
5)所有这一切都只发生在其中的线程代码中?
是的

最佳答案

Shawn Hargreaves 有一篇关于此的精彩帖子 here 。我在他的代码和你的代码之间看到的第一个区别是,你每次将 elapseTime 重置为 0,这会损失一些时间,而 Shawn 只是从他的 elapsedTime 中减去 1 秒。此外,Shawn 使用 ElapsedGameTime 而不是 ElapsedRealTime。他也在 Draw 函数中更新了他的frameCounter,而不是在 Update 函数中。

至于他为什么使用 ElapsedRealTime,他在帖子后的评论中解释了这一点:

> Surely 1 / gameTime.ElapsedRealTime.TotalSeconds

> will therefore give the current framerate.

That will tell you how long it was since the previous call to Update, but that is not the same thing as your framerate!

a) If the game is dropping frames, Update will be called more frequently in order to catch up. You want to time the number of actual draws that are taking place, not just these extra catch-up logic frames.

b) The time for a single Update can fluctuate widely, so the figure you get out of that will be too flickery to be easily readable.

我会尝试他的组件,看看它是否适合你。这篇文章相当老了,我认为您必须将 LoadGraphicsContent 更改为 LoadContent,将 UnloadGraphicsContent 更改为 UnloadContent,正如另一条评论指出的那样。

关于xna - 如何在XNA中正确计算FPS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2511766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com