FLIP 系统介绍:序

Date

在开始介绍 FLIP 动画之前,让我们先简单了解一下浏览器的渲染过程。

渲染

渲染步骤包括样式、布局、绘制,在某些情况下还包括合成。在解析步骤中创建的 CSSOM 树和 DOM 树组合成一个渲染树,然后用于计算每个可见元素的布局,然后将其绘制到屏幕上。在某些情况下,可以将内容提升到它们自己的层并进行合成,通过在 GPU 而不是 CPU 上绘制屏幕的一部分来提高性能,从而释放主线程。

渲染示意图
来自 Paul Lewis 的渲染示意图

样式(Style)

简而言之,将 DOM 和 CSSOM 组合成一个渲染树。像<head>或者<script>之类的是不会出现在渲染树中的。

布局(Layout)

这一步的目的是在渲染树上运行布局以计算每个节点的几何体。

布局是确定呈现树中所有节点的宽度、高度和位置,以及确定页面上每个对象的大小和位置的过程。 第一次确定节点的大小和位置称为布局。随后对节点大小和位置的重新计算称为回流。

绘制(Paint)

在绘制或光栅化阶段,浏览器将在布局阶段计算的每个框转换为屏幕上的实际像素。绘画包括将元素的每个可视部分绘制到屏幕上,包括文本、颜色、边框、阴影和替换的元素(如按钮和图像)。 为了确保平滑滚动和动画,占据主线程的所有内容,包括计算样式,以及回流和绘制,必须让浏览器在 1 帧(16.67 毫秒)内完成。为了确保重绘的速度比初始绘制的速度更快,屏幕上的绘图通常被分解成数层。注意这里提到的一个概念。如果发生这种情况,则需要进行合成。

绘制可以将布局树中的元素分解为多个层。将内容提升到 GPU 上的层(而不是 CPU 上的主线程)可以提高绘制和重新绘制性能。有一些特定的属性和元素可以实例化一个层,包括 <video><canvas>,任何 CSS 属性为 opacity 、3D transform、will-change 的元素,还有一些其他元素。这些节点将与子节点一起绘制到它们自己的层上,除非子节点由于上述一个(或多个)原因需要自己的层。

合成(Compositing)

当文档的各个部分以不同的层绘制,相互重叠时,必须进行合成,以确保它们以正确的顺序绘制到屏幕上,并正确显示内容。