速度基于时间而不是FPS

Velocity based on time rather than FPS

本文关键字:FPS 时间 于时间 速度      更新时间:2023-10-16

我正在制作一个简单的应用程序,我对一个对象施加重力。

我不希望物体在fps速率变化时走得太快/太慢,所以我四处寻找一种方法来做到这一点,我发现我需要将移动速度乘以delta时间。

所以我决定去做,但我遇到的问题比我想象的要多。

在游戏循环中,我有这个:

gravityRate = 0.02;
velocity.y +=  gravityRate;
objectPosition.y -= velocity.y;

这当然受到游戏fps的影响。

我想让物体每16毫秒移动0.02个单位,

所以我试着这样修改:

velocity.y += (gravityRate * (delta * 1000.0) ) / (1000 / 60);

而delta * 1000给出了经过的毫秒数…

到目前为止,它似乎工作得很好,物体以相同的速度移动,即使在较低的FPS下,它会跳跃较大的间隙,但这很好。

问题是我希望对象在某些场合跳起来。比如碰撞之类的,我过去常常这样做:速度。Y = -0.05;

但现在这个不起作用了,它确实起作用了,但它又依赖于fps。它在高FPS时跳得更高,在低FPS时跳得更低。(我认为这可能是因为多个调用聚集和降低速度超过预期,但事实并非如此,它只运行一次。)

我一直在努力解决这个问题,但随着时间的推移,我的问题越来越多。所以我非常感谢任何帮助

谢谢

根据时间计算你的速度和位置:

deltaTime = currentTime - timeLastFrame    // time sins last frame
velocityDelta = deltaTime * gravityRate    // velocity change 
// calculate new position with only half of the velocity change this frame
objectPosition.y -= (velocity.y + (velocityDelta / 2)) * deltaTime   
velocity.y += velocityDelta 

比例需要调整到你的游戏设置。


编辑:

那么在细节上-首先我们需要知道距离上次发生了多少时间:

deltaTime = currentTime - timeLastFrame    // time sins last frame

由于速度随时间不断增加,我们需要计算它自上一帧以来增加了多少。距离上一帧越长,速度变化越大,我们将其与时间相乘。

velocityDelta = deltaTime * gravityRate    // velocity change 

为了计算物体在帧内移动了多少,计算该帧内的平均速度。它等于初速度,velocity.y加上末速度,velocity.y + velocityDelta,除以2。简而言之,这可以写成(velocity.y + (velocityDelta / 2))。对于平均速度,我们可以通过乘以帧的时间来移动物体:

objectPosition.y -= (velocity.y + (velocityDelta / 2)) * deltaTime   

为了准备下一帧,我们还需要更新速度:

velocity.y += velocityDelta