我知道requestAnimationFrame在浏览器重新渲染之前会被调用,频率大约为60fps,但如果requestAnimationFrame的回调中有一个很长的javascript,它会阻止浏览器的重新渲染吗?因此卡住了下一个请求动画帧?
接下来,如果没有内容或样式更改,为什么浏览器会以60fps的速度重新渲染?
是。
与任何基于事件的函数调用(requestAnimationFrame
、setTimeout
、addEventListener
等(一样,如果JS引擎正忙于运行另一个函数(甚至是早期迭代中的相同函数(,则新函数在前一个函数完成之前无法运行。
我是一名游戏开发人员,对此非常熟悉。任何渲染时间过长的帧不仅会降低帧速率,还会锁定DOM。
我强烈建议你研究一下网络工作者和屏幕外的画布。这允许您将繁重的负载推送到不会干扰动画帧或DOM的后台进程中。
在这里可以找到一些优秀的演示:https://developers.google.com/web/updates/2018/08/offscreen-canvas
虽然你所说的关于60fps是真的,但有时只是根据文档
requestAnimationFrame((调用在大多数浏览器中在后台选项卡或隐藏iframe中运行时都会暂停,以提高性能和电池寿命。