我在游戏中的物体波动不定时遇到了一些麻烦。
如果没有限制帧速率,游戏将顺利进行。
如果我将帧速率设置为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。
答案 0 :(得分:1)
使用的唯一理由:
m_distance += m_speed * GetFrameTime();
如果您正在尝试获得与帧无关的移动。在这种情况下,没有理由限制你的FPS。
如果你有一个FPS上限,比如SFML实现的那个,我建议每帧保持移动不变。也就是说,这样的事情:
m_distance += m_speed;