如何在特定时间内按特定因素改变速度,同时在不同的帧率下保持一致?

How can I change velocity by a certain factor for a certain time, while remaining consistent at different framerates?

这是一个游戏,当帧率为每秒30帧时,我希望某个物体的速度以每帧98%的速率降低。但是,帧率可以是每秒 30 到 60 帧之间的任何值。我想到的最佳解决方案如下:

速度 *= 1.0 - 0.02 * (delta / maxDelta);

所以在这种情况下,如果帧率为 30 fps,则速度将乘以 1.0 - 0.02 * 1.0 = 0.98。如果帧率为 60 fps,则速度将乘以 1.0 - 0.02 * 0.5 = 0.99。但这并不完全正确,因为在 60 fps 下,2 帧后该因子将为 0.9801,而不是 0.98。几乎在那里,但不完全是。有没有一种简单的方法可以更精确地做到这一点?谢谢。

假设您的 FPS 始终为 30,我们能否将速度表示为帧数的直接解析函数,而不是增量算法?
是的,我们可以,v = 0.98 ^ frame_number^ 是求幂。

然后我们可以将其重新表示为时间的函数(以秒为单位):v = 0.98 ^ (total_time_elapsed * 30)。但是后来我们注意到这个函数是连续的,不依赖于帧长度。

如果你真的需要把它变成一个增量公式,它可以重新计算成v = v * 0.98 ^ (time_elapsed_since_previous_frame * 30)

基本上我想你想达到determinism。您希望输出与帧速率无关。

大多数物理引擎都执行统一的时间步长以确保确定性。您可以阅读统一时间步长 here, and a tutorial 来实现相同的内容。


好处:

  • 实现均匀时间步长后,您可以简单地实现恒定加速度,这看起来很逼真,无需使用复杂的速度公式。

  • 虽然这看起来像是一些额外的工作,但这是大多数物理引擎使用的经过时间考验的方法。您找到的那么多资源也会更相关。

  • 实现这个可以让你自由地玩弄更复杂的速度逻辑,而不用担心帧速率。

祝你好运。