从合成层着手优化动画

198 阅读2分钟

合成是将页面的绘制部分放在一起以显示在屏幕上的地方。

有两个影响页面性能的关键因素:需要管理的合成器层数,以及用于动画的属性

先上结论:

1,在写动画时坚持使用 transform 和 opacity;

2,使用 will-change 或 translateZ 提升动画元素;

3,避免过度使用提升规则,层需要内存和管理。

在写动画时坚持使用 transform 和 opacity

性能最佳的像素管道版本会避免布局和绘制,只需要合成更改;

1.png

为了实现此目标,需要坚持更改可以由合成器单独处理的属性。目前只有两个属性符合条件: transform 和 opacity。

2.png

使用 transform 和 opacity 时需要注意,更改这些属性的元素应该在自己的合成层上。为了创建层,你必须提升元素,我们将在接下来介绍。

如果还想使用其他属性写动画,请查看FLIP 原则 或者 这篇,它可以帮助将比较小好性能的动画重新映射为性能开销较小的 transform 和 opacity。

使用 will-change 或 translateZ 提升动画元素

你需要把动画元素提升到它们自己的合成层,注意:需要有合理理由,不要过度使用;

.moving-element {
  will-change: transform;
}

will-change可以提前警示浏览器即将出现更改,根据你打算更改的元素,浏览器可能可以预先安排,如创建合成器层。

真的较旧的浏览器,可能不支持 will-change,使用下面的代码:

.moving-element {
  transform: translateZ(0);
}

管理层,避免层爆炸

有些开发者知道层通常有助于提高性能后,可能很想通过以下方式提升页面上的所有元素:

* {
  will-change: transform;
  transform: translateZ(0);
}

创建的每一层都需要内存和管理,在内存有限的设备上,对性能的影响远远超过创建层的任何好处。每一层的纹理都需要上传到 GPU,因此在 CPU 和 GPU 之间的带宽以及 GPU 上可用于纹理的内存方面存在进一步的限制。

所以,对没必要的元素不要进行提升。

使用Chrome DevTools 来理解层

如图所示,开启layers;

3.png

全文完。

参考文章

web.dev/stick-to-co…