我一直在游戏中物体的不稳定运动遇到一些麻烦。
如果帧速率没有上限,则游戏运行流畅。
如果我将帧速率限制为 60 fps,则运动是不稳定的。
物体的运动是这样的……
m_distance += m_speed * GetFrameTime()
其中速度以每秒像素为单位,GetFrameTime() 返回自上一帧以来经过的时间。请注意,对象仅在 x 和 y 方向上移动。
我正在使用 SFML,具有函数SetFramerateLimit(60)
和UseVerticalSync(true)
. 在尝试解决不稳定的运动问题时,我阅读了 XNA 开发人员的一篇文章,内容是他们如何更新一次、渲染一次,然后如果游戏循环中剩余的时间 < 帧速率(即 1/60)那么他们在那段时间剩下的时间里我都会睡觉。我相信这就是 SFML 所做的,因为我禁用了这些功能并在该行为中写入,我得到了相同的症状。
现在我并不是说上述方法是一件坏事。事实上,我喜欢该应用程序没有做不必要的工作(在使用设置的帧限制和没有设置帧限制运行应用程序时,资源使用情况存在显着差异)。但是,我真的不知道为什么运动是波涛汹涌的。我已经阅读了 gafferongames 文章,但它们似乎不适用于这里。
任何帮助表示赞赏,谢谢。
编辑:我已经确定了问题,现在只是不知道如何解决它。
在对象“跳跃”的帧上,m_distance 明显大于其他帧中的距离。仔细观察,GetFrameTime() 也显着大于帧之间的先前时间(显着差异为 2-3 毫秒)。
Edit2:我相信我已经想出了一个解决方案,这要归功于http://gafferongames.com/game-physics/fix-your-timestep/。设置一个固定的增量时间,而不是使用 GetFrameTime。