渲染流水线总结

<aside> 💡 0. 渲染进程将 HTML 内容转换为能够读懂的 DOM 树结构。

  1. 渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets,计算出 DOM 节点的样式。
  2. 创建布局树,并计算元素的布局信息。
  3. 对布局树进行分层,并生成分层树。
  4. 为每个图层生成绘制列表,并将其提交到合成线程。
  5. 合成线程将图层分成图块,并在光栅化线程池中将图块转换为位图。
  6. 合成线程发送绘制图块命令 DrawQuad 给浏览器进程。
  7. 浏览器进程根据 DrawQuad 消息生成页面,并显示到显示器上。

</aside>

相关概念

  1. 重排:更新了元素的几何属性

    如果改变了元素的宽度、高度等几何位置属性,浏览器就会出发重排,解析之后的一系列子阶段都会重新执行,开销最大。

  2. 重绘:更新了元素的绘制属性

    通过 JavaScript 改变某些元素的颜色,没有引起几何位置属性变化,布局阶段将不会被执行,直接进入绘制阶段,然后执行之后的一系列子阶段。相较于重排,省去了布局和分层阶段,执行效率会比重排高一些。

  3. 直接合成阶段:

    改变一个既不要布局也不要绘制的属性,渲染进程将跳过布局和绘制,只执行后续的合成操作。

    如使用 CSS 的 transform 来实现动画效果,可以避开重排和重绘阶段,直接在非主线程上执行合成动画操作。