实现与帧率无关的加速

Posted

技术标签:

【中文标题】实现与帧率无关的加速【英文标题】:Implementing Framerate-independent Acceleration 【发布时间】:2019-08-08 11:36:04 【问题描述】:

我正在尝试制作一个基于 html5 画布的游戏,其中涉及与帧速率无关的运动(对象以相同的速率移动,与 FPS 无关)。

我知道如何在以恒定速率移动的对象上实现与帧速率无关的运动。然而,在我的新游戏中,物体不会以恒定的速度移动 - 它们会加速。

我想让一个物体以每秒一个像素的速度加速,这样在每一秒结束的时候,物体都会在某个位置,不管FPS如何,如下图(从position = 0开始,速度 = 0:

Second 1: position: 1, velocity: 1
Second 2: position: 3, velocity: 2
Second 3: position: 6, velocity: 3
Second 4: position: 10, velocity: 4
...

除非我弄错了,这种情况可以用position += velocity += acceleration (1)之类的公式重现。

如何实现与帧速率无关?

【问题讨论】:

您是否要求一个将位置作为时间函数的公式? 理想情况下,是的。它应该考虑每秒需要更新的次数 (FPS),以及每秒的加速度(在这种情况下,在任何方向上都是 1)。 【参考方案1】:

如果加速度是常数a,在时间t=0,速度是V0,位置是X 0 然后在稍后的某个时间 t 速度和位置将是:

V = V0 + a tX = X0 + V0 t + a t2支持>/2

例如,如果我们取 a = 1 并从位置 = 0 开始,速度 = 0,我们以 1.0 的间隔对速度和位置进行采样:

Second 1: position: 0.5  velocity: 1
Second 2: position: 2    velocity: 2
Second 3: position: 4.5  velocity: 3
Second 4: position: 8    velocity: 4

但我们可以随时计算位置和速度。帧率没有出现在公式中。

【讨论】:

是否可以进行类似的操作,以使每一秒的位置而不是速度保持不变?例如,位置应分别为 1、3、6、10...。 @Nick362880: 是的,只要设置 X0=0, V0=0.5, a=1,你就会得到 x=1, 3, 6, 10, 15, 21,...

以上是关于实现与帧率无关的加速的主要内容,如果未能解决你的问题,请参考以下文章

回复@吾爱林有关用ffmpeg加速视频和改变帧率测试

RTP timestamp与帧率及时钟频率的关系

游戏开发中——垂直同步绘制效率显示器刷新频率与帧率

小米游戏加速原神gpu设置

FFmpegFFmpeg 相关术语简介 二

Android 位图帧率问题