Javascript-使用delta时间的游戏循环
Javascript - gameloop using delta time
我正在尝试实现一个使用delta时间的游戏循环。我从这篇文章中得到了以下代码,但我觉得它不能很好地解释这种类型的游戏循环。我对requestAnimationFrame进行了研究,但似乎没有任何解释是有用的。有人能简单地分解一下这个循环是如何工作的吗?
function timestamp() {
return window.performance && window.performance.now ? window.performance.now() : new Date().getTime();
},
var now,
dt = 0,
last = timestamp(),
step = 1/60;
function frame() {
now = timestamp();
dt = dt + Math.min(1, (now - last) / 1000);
while(dt > step) {
dt = dt - step;
update(step);
}
render(dt);
last = now;
requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
requestAnimationFrame
是一个特殊的计时器。与setInterval
在给定的最小毫秒后重复执行回调不同,requestAnimationFrame
可变地执行以实现平滑的帧速率。
问题在于requestAnimationFrame
是如何做到这一点的。根据情况,它可能运行得更快或更慢。这意味着,如果您的更新逻辑直接绑定到requestAnimationFrame
,当requestAnimationFrame
以60fps运行时,以"每次更新一步"运行的角色将在一秒钟内移动60步,但当它降到40fps时,只会移动40步。
为了抵消计时器的突然加速/减速,我们使用"增量时间"。不是依赖于requestAnimationFrame
的每次迭代来调用更新,而是检查帧之间的时间,看看是否是调用更新的正确时间。
假设你的角色应该每100毫秒走一步。如果游戏以每秒60帧的速度运行,则大约每6帧100毫秒。这意味着,对于每次迭代,您的代码都会检查是否已经过了100ms。在第6帧左右,它会这样做,并调用更新。现在,如果计时器以每秒40帧的速度运行,100毫秒大约是4帧。同样的逻辑,在每次迭代中,它都会检查是否经过了100毫秒。在第4帧,它执行并调用update。有了这一点,您就可以确保无论波动如何,都会持续调用更新。
- setInterval游戏循环的范围问题
- 三.js对象启动动画/游戏循环
- 节点.js和画布,游戏循环不同步
- JavaScript 游戏循环不起作用
- 检查图像是否在游戏循环之前加载
- 使用 requestAnimationFrame 的 JS 游戏循环 - 对象函数只调用一次
- WP 8.1 WinJS-如何停止游戏循环
- Javascript游戏循环-如何知道循环外的函数经过了多少时间
- 游戏循环使我的浏览器崩溃
- 如何在javascript中实现准确的跨平台游戏循环
- 简单的记忆游戏;t更新其状态.糟糕的游戏循环
- 游戏循环内存泄漏
- 我在努力完善游戏循环
- Javascript游戏循环
- Node.js: setInterval的替代方案,它对游戏循环更精确
- 动态WebGL绘制游戏循环
- 为什么当touchstart事件触发时setTimeout游戏循环会出现延迟
- setInterval在游戏循环中,没有按预期工作
- Javascript-使用delta时间的游戏循环
- 以相同速度运行的Javascript游戏循环