我写了一个组件来显示当前的 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();
}
这段代码的主要思想是始终在不同的线程中运行 pathFinding 算法。
奇怪的事情是我的意思是有时 FPS 会急剧下降,这很明显,但显示的 FPS 变化的频率超过每秒一次。如果我理解此代码,FPS 的更改频率不会超过每秒一次。
有人可以解释一下发生了什么吗?
编辑 26.03.2010
我还发布了 Draw 方法的代码。
编辑 31.03.2010 Venesectrix 问题的答案
1) 您是在使用固定时间步长还是可变时间步长运行?
IsFixedTimeStep 和 SynchronizeWithVerticalRetrace 设置为 true。
2)发生这种情况时,您是否正在移动 XNA 窗口?
否
3) XNA 窗口是否有焦点?
是
的 4) 它有多引人注目(即,更新速度如此之快以至于您无法阅读,或者只是更新不到一秒钟)?
我能够读取更新,FPS 每秒更新约 3 次。
5)所有这一切都只发生在那里的线程代码?
是的