Kle*_*šir 8 c# windows cpu xna frame-rate
我今天刚刚注意到,当我编译并运行一个新的XNA 4.0游戏时,其中一个CPU线程以100%运行,帧速率降至54 FPS.
奇怪的是,它有时会以60 FPS的速度运行,但之后只会下降到54 FPS.
我之前没有注意到这种行为,所以我不知道这是否正常.我卸载了我的防病毒软件并重新安装了XNA Game Studio,XNA Redistributable和.NET Framework 4.
如果我将IsFixedTimeStep设置为false,则游戏以60 FPS运行,CPU使用率最低(1-2%).但据我所知,这需要我使用ElapsedGameTime进行速度计算,但我不知道该怎么做,因为我对XNA很新.但是有人说将其设置为false可以减少抖动动画.
我已经检查了这个论坛帖子,但没有人找到一个好的解决方案.
有没有人遇到过这个问题?
编辑: 我做了一些更多的研究,我实现了一个FPS计数器(到现在为止,我用Fraps测量它),我的计数器显示比赛在60 FPS的速度运行(与IsFixedTimeStep = TRUE),所以这解决了FPS的问题,但CPU使用率仍然很高.这可能发生在每个人身上吗?
nee*_*eKo 19
据在Xbox Live独立游戏论坛的讨论,显然在某些处理器(和OS-S)XNA占用的默认值时,在一个核心100%的CPU时间 Game.IsFixedTimeStep 使用.
一个常见的解决方案(也适用于我)是将以下内容放在Game构造函数中:
IsFixedTimeStep = false;
Run Code Online (Sandbox Code Playgroud)
的Game.IsFixedTimeStep属性,当true,可确保您的帧(Update(),Draw(),...)被称为在一个固定时间间隔中指定Game.TargetElapsedTime.默认为每秒60个呼叫.
何时Game.IsFixedTimeStep = false,当前一帧完成时,将发生对下一帧的调用.这在下面的时间图中说明:

需要修改所有固定时间计算(移动,计时等)以适应可变时间步长.谢天谢地,这很简单.
假设你有
Vector3 velocity;
Vector3 position;
Run Code Online (Sandbox Code Playgroud)
对于某些对象,您正在使用更新位置
position += velocity;
Run Code Online (Sandbox Code Playgroud)
默认情况下,这意味着对象的速度是 60 * velocity.Length()每秒的单位.你每秒增加速度60次.
当您将该句子翻译成代码时,您会得到以下简单修改:
position += velocity * 60 * gameTime.ElapsedGameTime.TotalSeconds;
Run Code Online (Sandbox Code Playgroud)
简单来说:您根据已经过了多长时间来缩放添加的值.
通过在您执行移动(或定时等)的位置进行这些修改,您将确保您的游戏在固定时间步骤时的行为.