根据Xbox Live 独立游戏论坛上的此讨论 http://xboxforums.create.msdn.com/forums/t/46682.aspx,显然在某些处理器(和操作系统)上 XNA 占用当默认值为 100% 时,一个核心上的 CPU 时间为 Game.IsFixedTimeStep
is used.
A 共同解决方案(对我也有用的一个)是将以下内容放入您的Game
构造函数:
IsFixedTimeStep = false;
这是什么意思?
The Game.IsFixedTimeStep http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.game.isfixedtimestep%28v=xnagamestudio.10%29.aspx财产,当true
,确保您的框架(Update()
, Draw()
, ...) 被调用于固定时间间隔指定于Game.TargetElapsedTime
。这默认为每秒 60 次调用.
When Game.IsFixedTimeStep = false
,对下一帧的调用将在前一帧完成时发生。下面的时间图说明了这一点:
此更改如何影响我的代码?
所有固定时间计算(动作, timings等)需要进行修改以适应可变的时间步长。值得庆幸的是,这很简单.
假设你有
Vector3 velocity;
Vector3 position;
对于某些对象,您正在更新位置
position += velocity;
默认情况下,这意味着你的物体的速度是 60 * velocity.Length()
每秒单位。每秒增加 60 次速度。
当你把这句话翻译成代码时,你会得到这个简单修改:
position += velocity * 60 * gameTime.ElapsedGameTime.TotalSeconds;
简单来说:您根据经过的时间来缩放添加的值.
通过在执行移动(或计时等)的地方进行这些修改,您将确保您的游戏按照固定时间步长时的方式运行。