requestIdleCallback和requestAnimationFrame,浏览器的渲染步骤和造成卡顿原因

121 阅读1分钟

首先要理解浏览器的网页加载

  • js线程->JS脚本执行

  • GUI线程->渲染html 浏览器布局、绘制

我们知道,JS可以操作DOM,GUI渲染线程JS线程是互斥的。所以JS脚本执行浏览器布局、绘制不能同时执行。

刷新率为60hz的浏览器,每秒更新60帧画面,每次更新耗时16.6ms,每次更新都会做以下3件事,在每16.6ms时间内,需要完成如下工作:

JS脚本执行 -----  样式布局 ----- 样式绘制

当JS执行时间过长,超出了16.6ms,这次刷新就没有时间执行样式布局样式绘制了。 就会出现我们遇到过的:JS脚本执行时间过长,页面掉帧,造成卡顿。

上面说到的每一帧内执行的事件如图:

image.png 如果在(16.6ms)内执行完,则可以保证60帧,画面流畅;如果500ms甚至2000ms则页面明显卡顿

requestIdleCallback 和 requestAnimationFrame

requestAnimationFrame:在每一帧中一定执行,样式变更以及布局计算之前就执行

requestIdleCallback:在每一帧不一定执行,样式变更以及布局计算之后空闲时才执行