提出背景
浏览器渲染限制
浏览器的帧
页面是一帧一帧绘制出来的,当每秒绘制的帧数(FPS)达到 60 时,页面是流畅的,小于这个值时,用户会感觉到卡顿。
上图是一帧内需要完成的任务,浏览器在一帧内可完成如下任务:
输入事件捕捉:
- 浏览器首先会接受用户的输入事件,如点击、滚动、触摸等,并准备将其转换为相应的处理逻辑。
- Blocking input events(阻塞输入事件):例如
touch
或wheel
- Non-blocking input events(非阻塞输入事件):例如
click
或keypress
事件回调执行:
- 对于已注册的事件监听器,浏览器会执行相应的事件回调函数,处理用户输入或页面状态的变化。
帧开始(Begin frame):
- 每一帧事件(Per frame events),例如
window resize
、scroll
或media query change
样式计算和布局:
- rAF(requestAnimationFrame)
- 浏览器会解析和计算CSS样式,确定页面中每个元素的尺寸和位置。这个过程称为布局或重排。
绘制渲染(Paint):合成更新(Compositing update)、重绘部分节点(Paint invalidation)和 Record
绘制(渲染):
- 在确定了元素的样式和位置后,浏览器会开始绘制页面。
- 这包括将文本、图像和其他内容绘制到屏幕上。绘制操作可能涉及多个层级的渲染,最终合成到屏幕上显示。
合成:
- 如果页面使用了硬件加速(如CSS3D转换或WebGL),浏览器会将不同层级的渲染结果合成到一起,形成一个完整的页面图像。
空闲回调执行:如果在一帧的剩余时间内还有空闲时间,并且存在待执行的空闲回调(如RequestIdleCallback),浏览器会尝试执行这些回调。这些回调通常用于执行非关键性的、可延迟的任务。
浏览器的渲染过程受到设备刷新率的限制。一般来说,设备的刷新率是60Hz,意味着每秒钟有60帧的渲染机会。因此,浏览器需要在大约16.67毫秒(1000毫秒/60帧)内完成上述所有任务,以确保流畅的动画和用户交互。