前端性能优化-第二篇(渲染性能与合成层)

52 阅读1分钟

摘要: 在了解了回流与重绘之后,我们深入到浏览器的渲染机制,探索如何利用transformopacity属性来创建合成层,实现最极致的动画性能。

核心内容

  1. 浏览器渲染管线(Rendering Pipeline)

    • 回顾:回流(Layout/Paint) -> 重绘(Paint) -> 合成(Composite)。
    • 目标:尽可能跳过回流和重绘,直接进入合成阶段。
  2. 什么是合成(Compositing)?

    • 浏览器将页面的不同部分分层(Layers),分别栅格化,并在合成线程(Compositor Thread)中组合成页面的过程。
    • 优势:合成是在独立的线程中进行的,不占用主线程,因此效率极高,即使主线程繁忙,动画也能保持流畅。
  3. 如何触发合成层?

    • 最常用且高效的方式是使用CSS的 transform 和 opacity 属性。
    • 原因:它们的变动不影响文档流、几何形状或颜色(不影响布局和绘制),通常只需GPU进行合成。
  4. 优化技巧

    • 动画性能:将动画元素应用 transform: translateZ(0) 或 will-change: transform 来提升至新的合成层。
    • 谨慎使用:过多的合成层会消耗大量内存和管理开销。只在性能关键的地方使用。
    • 最佳实践
      • 使用 transform: translate(x, y) 代替修改 lefttop
      • 使用 transform: scale(x) 代替修改 widthheight
      • 使用 opacity 代替修改 visibility 或直接改变颜色来实现显隐。
  5. 会导致回流的属性 vs. 仅导致合成的属性

    • 回流widthheightmarginpaddinglefttop...
    • 重绘colorbackground-colorvisibility...
    • 合成transformopacity