首页 > 解决方案 > Firefox 正在限制 setInterval

问题描述

我正在尝试制作一个基于网络的游戏,并且我使用setInterval每秒 60 次来更新游戏(位置、碰撞检查等)。

它在大多数浏览器中运行良好,但出于某种原因,Firefox有时会将其限制为每秒约 35 次。是的,有时。如果 DevTools 关闭,它会节流,但如果你打开 DevTools 并开始记录性能,它会跳到 60 并保持这种状态,直到 DevTools 关闭。

如果您使用的是 Firefox,请运行代码段并尝试:

var cycles = 0;
setInterval(()=>{
  cycles++;
}, 1000/60);
setInterval(()=>{
  console.log("Update cycles per second: %i", cycles);
  cycles = 0;
}, 1000);

这是一个错误吗?如果没有,为什么会发生这种情况,我该如何解决?

编辑:我不用setInterval来渲染。为此,我使用requestAnimationFrame. 我习惯于以恒定的时间间隔setInterval更新游戏,因为在重新绘制之前触发,并且严重依赖于用户屏幕的刷新率。requestAnimationFrame

标签: javascriptfirefoxsetinterval

解决方案


您不应该依赖计时器的准确性。他们往往不是。相反,依靠时间是准确的:

 var cycles = 0, start = Date.now();
 setInterval(() => {
  cycles = Math.floor((Date.now() - start) / 1000 * 60);
 }, 1000/60);

也就是说,requestAnimationFrame对于您的使用来说,可能是比 更好的选择setInterval,因为它在每次重新渲染时都会被调用。


推荐阅读