帧率独立加速

时间:2011-03-10 15:08:23

标签: actionscript-3 physics formula

所以我理解,要获得与帧速率无关的移动,我必须将基本速度乘以(1000 / delta)。它适用于表示速度的值,但是当我尝试使用加速变量时,例如重力,它不会工作,它甚至不是帧率独立的。

加速度变量有不同的公式,还是我忘了其他的东西?

示例:

var Multiplier:Number = (GetDeltaTime()) / (1000 / 30);
jumpVelocity = -21 * Multiplier //works
gravity = 1.5 * Multiplier //dosn't work

这是在每一帧的开头调用的

编辑:找到一个解决方案,我不得不平方delta时间。不是100%肯定它为什么会起作用,但确实如此。

所以:

jumpVelocity = -21 * Multiplier //unchanged
gravity = 1.5 * Math.pow(Multiplier,2) //works now

1 个答案:

答案 0 :(得分:2)

基本上你想要做的是测量自上一帧(“帧时间”)以来经过的时间,并将其添加到累加器。

然后,您通过“固定时间步长”(例如1/30秒)转发游戏状态,并从累加器中减去该模拟时间,直到它少于一个时间步。

以此为例:

  • 累加器从0开始
  • 固定时间步长设置为33毫秒

  • 1帧以20fps传递,帧时间为1000ms / 20 = 50ms

  • 50ms添加到累加器
  • 游戏状态转发1个固定时间步(33ms),从累加器中减去该时间
  • 累加器现在是17ms,小于一个固定时间步长 - >游戏状态已完成更新
  • 继续下一帧

  • 1帧以10fps通过,帧时间为1000ms / 10 = 100ms

  • 100ms添加到累加器
  • 累加器现在是117毫秒
  • 游戏状态转发1个固定时间步(33ms),从累加器中减去该时间
  • 累加器现在是84ms,这是一个以上的固定时间步长 - >游戏状态未完成更新
  • 游戏状态转发1个固定时间步(33ms),从累加器中减去该时间
  • 累加器现在是51ms,这是一个以上的固定时间步长 - >游戏状态未完成更新
  • 游戏状态转发1个固定时间步(33ms),从累加器中减去该时间
  • 累加器现在是18ms,其小于一个固定时间步长 - >游戏状态已完成更新
  • 继续下一帧

Glenn Fiedler有一篇关于这个问题的优秀文章。你可以找到它here