我正在使用HTML5 Canvas(2D上下文)和自定义JS引擎(无框架)开发一个2D顶视角浏览器竞速游戏。
我遇到了一个火狐浏览器的问题,无法用语言描述。

问题:
克罗米姆浏览器 - 立即运行平滑 (\~8-10 ms dt,感受到 120 FPS)

火狐浏览器 - 开始较慢 (\~16-18 ms dt,感受到 \~60 FPS)

但如果我切换到另一个选项卡,然后返回,那么它 INSTANTANEOUS 便成平滑 (与克罗米姆相同)

实际上,火狐浏览器在切换选项卡后“修复”了自己。

JavaScript 游戏循环:
function loop(ts) {
const dt = ts - lastTs;
lastTs = ts;
update(dt);
render();
requestAnimationFrame(loop);
}

渲染设置:
Canvas: 2D上下文 (drawImage-heavy)
基于块的世界 (64x64块)
每帧有非常多的绘制调用 (块,实体,效果,UI)
无WebGL,无框架
我测量的结果:
使用performance.now():
火狐浏览器(在选项卡切换之前):\~16–18 ms
火狐浏览器(在选项卡切换之后):\~8-10 ms
克罗米姆:\~7-12 ms
真相的是,显然是60Hzvs120Hz行为差异。

系统:
OS:CachyOS (Linux)
CPU:AMD Ryzen 7 7800X3D
GPU:Sapphire Radeon RX 9070 XT
RAM:64 GB DDR5
主显示器:120Hz
第二显示器:60Hz(我也尝试过关掉这个显示器)
浏览器:最新火狐+克罗米姆

我尝试过的:
禁用所有火狐扩展
使用requestAnimationFrame(无setInterval)
检查显著的CPU瓶颈
添加可见性/焦点监听器(问题始终在选项卡切换后更改)

这是火狐的已知问题与:

刷新率/ rAF 时钟 (120Hz显示器)?

canvas合成或节流?

焦点/可见性状态影响帧速率?

检查火狐是否使用GPU,确实是。

还是点明指向我的循环中(例如dt处理或frame依赖逻辑)?

它似乎不是一个原始性能问题,因为切换选项卡后它会立即“修复”。

任何想法或你应该查找的建议都将不胜感激。