Animation 当帧速率被限制时,对象移动会发生突变

Animation 当帧速率被限制时,对象移动会发生突变,animation,rendering,sprite,frame-rate,game-loop,Animation,Rendering,Sprite,Frame Rate,Game Loop,我在游戏中遇到了一些物体起伏运动的问题 如果帧速率不设上限,游戏将运行顺畅 如果我将帧速率限制在60 fps,那么运动是起伏的 对象的运动如下所示 m_distance += m_speed * GetFrameTime() 其中,速度以每秒像素为单位,GetFrameTime()返回自上一帧以来经过的时间。请注意,对象仅在x和y方向上移动 我使用的是SFML,它具有函数SetFramerateLimit(60)和UseVerticalSync(true)。在试图解决运动不稳定的问题时,我读了

我在游戏中遇到了一些物体起伏运动的问题

如果帧速率不设上限,游戏将运行顺畅

如果我将帧速率限制在60 fps,那么运动是起伏的

对象的运动如下所示

m_distance += m_speed * GetFrameTime()
其中,速度以每秒像素为单位,GetFrameTime()返回自上一帧以来经过的时间。请注意,对象仅在x和y方向上移动

我使用的是SFML,它具有函数
SetFramerateLimit(60)
UseVerticalSync(true)
。在试图解决运动不稳定的问题时,我读了一篇来自XNA开发人员的文章,内容是关于他们如何更新一次、渲染一次,然后如果游戏循环中还有时间<帧速率(即1/60),那么他们将在剩余的时间内睡觉。我相信这就是SFML所做的,因为我禁用了这些函数并在该行为中编写了代码,我得到了相同的症状

现在我并不是说上述方法是一件坏事。事实上,我喜欢应用程序没有做不必要的工作(在使用设置的帧限制和不使用设置的帧限制运行应用程序时,在资源使用方面有明显的差异)。然而,我真的不知道为什么这场运动是波涛汹涌的。我读过gafferongames的文章,但它们似乎不适用于这里

非常感谢您的帮助,谢谢

编辑:我已经确定了问题所在,现在只是不确定如何解决它

在对象“跳跃”的帧上,m_距离明显大于其他帧中的距离。仔细检查,GetFrameTime()也明显大于之前帧之间的时间(显著的差异类似于2-3毫秒)


Edit2:多亏了你,我想我已经想出了一个解决办法。设置固定的增量时间,而不是使用GetFrameTime。

使用此选项的唯一原因:

m_distance += m_speed * GetFrameTime();
如果你想得到独立于帧的运动。在这种情况下,没有理由限制FPS

当您有一个FPS上限(如SFML实现的)时,我建议保持每帧的运动恒定。也就是说,类似这样的事情:

m_distance += m_speed;

你是说
m_distance+=m_speed*GetFrameTime()
?哈哈,我想建议你读一读“修复你的时间步长”这篇文章,你也实现了“插值”吗?