性能优化--页面渲染中

243 阅读2分钟

网页是3D分层的
FPS帧--网页是一帧一帧渲染的,每秒60帧会非常流畅

Performance --> Summary
  • Loding 页面loading时间 生成dom树 和css树
  • Scripting 脚本执行时间
  • Rendering 重排
  • Painting 重绘
  • System 系统时间
  • Idle 空闲时间

网页渲染过程:

  1. 获取dom节点,分割成多个层 Parse HTML
Performance -->Call Tree 的时候要把HTML的dom树分层
  1. 对每个层计算样式结果 (通过Recalculate Style来计算样式结果)
  2. 为每个节点生成图形和位置重排layout
  3. 将每个节点绘制并填充到图层的位图中 重绘paint
  4. 绘制出来的纹理长传到GPO 这一步是合成 层Composite Layers

大致的流程:重排、重绘、合成

网页什么时候会分层?

1. 根元素
2. position
3. transform
4. 半透明
5. 滤镜
6. canvas
7. video
8. overflow

GPU的参与

  • 参与的好处:跨过重绘和重排,直接用GPU合成层

  • 什么时候参与:

1. css3D
2. video
3. webGL
4. transform
5. css滤镜

CPU和GPU

  • 相同之处:
两者总有总线和外界联系
有自己的缓存体系、以及数字和逻辑运算单元
都是为了完成计算任务
  • 不同之处:
CPU操作系统和应用程序,GPU显示相关(CPU虽然能干,但是效率低)

读取有些属性的时候会造成重排

重绘不一定造成重排,但是重排一定重绘
  • 为什么读取某些属性会造成重排? 因为他会释放掉当前计算的当前任务

  • 读取哪些属性会造成重排 offset相关的 scroll width height

  • 怎么解决 读写分离 把会造成重排的属性先定义成变量,等到下一帧的时候再去设置相关的值

  • 获取下一帧
    requestAnimationFrame
    requestIdleCallback
    一帧的时间:1000/60 = 16.6毫秒