Skip to content

硬件加速

又叫 GPU 加速, 创建独立的复合图层,让GPU来渲染这个图层,不会触发重绘,从而提高性能

硬件加速如何工作的

  • 页面解释成DOM输。DOM树和CSS让浏览器构建渲染树。渲染树包含渲染对象
  • 在页面中需要渲染的元素。每一个渲染对象被分配到一个图层中。每一个图层被更新到GPU,通过transform的层会使用GPU渲染,因此不需要重绘,就像3D图形一样。这个转换是单独处理的。

硬件注意问题

  • 不是所有元素都硬件
  • 若不在动画关闭硬件加速,会让字体模糊

提升合成层好处

  • 合成层的位图,会交由 GPU 合成,比 CPU 处理要快(GPU 上合成图层可以在涉及大量像素的绘图和合成操作中实现比 CPU(无论是在速度和功耗方面)还要好的效率。硬件专为这些类型的工作负载而设计, GPU 上的内容不需要昂贵的回读, CPU 和 GPU 之间的并行性,可以同时运行以创建高效的图形管道)
  • 当需要 repaint 时,只需要 repaint 本身,不会影响到其他的层
  • 元素提升为合成层后,transform 和 opacity 才不会触发 paint,如果不是合成层,则其依然会触发 paint

常见的提升为合成层的属性

  • will-change: transform; // opacity、transform、top、left、bottom、right
  • transform: translateZ(0); // 对于个别不支持的浏览器
  • video、canvas、iframe 等元素。

隐式合成

  • 一个动画元素A被另一个元素B改在上了,A动画元素是合成层,为了避免A提升到合成层被B 盖住,会把B也提升到合成层。
  • 一个或多个非合成元素应出现在堆叠顺序上的合成元素之上,会被提升为合成层。

层爆炸

  • 不符合预期的合成层达到一定数量的时候,就会变成层爆炸, 添加 z-index 提升元素层级,避免其他元素的隐式合成

层压缩

  • 浏览器优化层爆炸,将多个层进行压缩成一个层,然而浏览器的自动层压缩并不是万能的,有很多特定情况下,浏览器是无法进行层压

硬件加速的坑

  • 不要把所有东西一股脑儿抛给 GPU 问题在于 GPU 并没有无限制处理性能,而且一旦资源用完的话,性能就会开始下降了(即使 CPU 并没有完全占用)。事实上他们有自己的职责,各司其职,各尽其才,才能发挥出更大的作用。
  • 减小合成层的尺寸, 因此对于一些纯色图层来说,我们可以使用 width 和 height 属性减小合成层的物理尺寸,然后再用 transform: scale(…) 放大,这样一来可以极大地减少层合成带来的内存消耗。

如何查看合成层

  • Rendering Show layer borders

参考

https://juejin.cn/post/6844903966573068301https://fed.taobao.org/blog/2016/04/26/performance-composite/

在 MIT 许可下发布