什么是重排、重绘和合成

一、重排

如果你通过 JavaScript 或者 CSS 修改元素的几何位置属性,例如改变元素的宽度、高度等,那么浏览器会触发重新布局,解析之后的一系列子阶段,这个过程就叫重排。无疑,重排需要更新完整的渲染流水线,所以开销也是最大的。

如果你修改了几何位置属性,那么会触发:

渲染主线程:

  • 重构布局树

  • 重构图层树

  • 重构绘制列表

合成线程+GPU进程:

  • 生成图块

  • 再次光栅化

浏览器主进程:

  • 重新生成页面

重排需要更新完整的渲染流水线,所以开销也是最大的。

一、重绘

如果修改了元素的背景颜色,那么布局阶段将不会被执行,因为并没有引起几何位置的变换,所以就直接进入了绘制(直接生成绘制列表)阶段,然后执行之后的一系列子阶段,这个过程就叫重绘。相较于重排操作,重绘省去了布局和分层阶段,所以执行效率会比重排操作要高一些。

三、合成

那如果你更改一个既不要布局也不要绘制的属性,会发生什么变化呢?渲染引擎将跳过布局和绘制,只执行后续的合成操作,我们把这个过程叫做合成。

我们使用了 CSS 的 transform 来实现动画效果,这可以避开重排和重绘阶段,直接在非主线程上执行合成动画操作(直接进行生成图块和光栅化)。这样的效率是最高的,因为是在非主线程上合成,并没有占用主线程的资源,另外也避开了布局和绘制两个子阶段,所以相对于重绘和重排,合成能大大提升绘制效率。

你可能感兴趣的:(浏览器工作原理,前端)