3

我一直在游戏中物体的不稳定运动遇到一些麻烦。

如果帧速率没有上限,则游戏运行流畅。

如果我将帧速率限制为 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。

4

1 回答 1

1

使用的唯一原因:

m_distance += m_speed * GetFrameTime();

是如果你想获得独立于框架的运动。在这种情况下,没有理由限制您的 FPS。

当您有 FPS 上限(例如 SFML 实现的)时,我建议保持每帧的移动不变。也就是说,像这样:

m_distance += m_speed;
于 2011-03-18T21:33:42.577 回答