javascript - 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
解决方案
您不应该依赖计时器的准确性。他们往往不是。相反,依靠时间是准确的:
var cycles = 0, start = Date.now();
setInterval(() => {
cycles = Math.floor((Date.now() - start) / 1000 * 60);
}, 1000/60);
也就是说,requestAnimationFrame
对于您的使用来说,可能是比 更好的选择setInterval
,因为它在每次重新渲染时都会被调用。
推荐阅读
- javascript - 如何遍历表并从行中提取值并与数据表进行比较
- sql - 如果经过 60 秒,则在 While 循环中跳过批处理
- sql - 基于错误估计优化使用索引查找的查询
- php - 如何使用 cakephp 生成主键
- android - 如何根据 API 响应触发应用内导航
- android - 是否有任何原因 PeriodicWorkRequest 不在 API 级别 23 上重复?
- html - chrome和IE11之间的html和css对齐
- php - PHP:与其日期对应的组数组
- ios - [__SwiftValue encodeWithCoder:]:发送到实例的无法识别的选择器
- android - 无论如何要下载模拟器图像来为Android Studio手动配置它?