flutter之性能测试和理论

Flutter的渲染阶段

VSync->Animation->Build->Layout->Paint->Display List(GPU)

  • Build : Widget,Element树
  • Layout,Paint: RenderObject树的创建
  • Display List(GPU),是对Layer图层的创建

检查Flutter的渲染

Debug模式和最终的生产模式,有很大的性能特点,所以在做真实的测量之前都用Profile模式

  • Debug模式
  • Profile模式

RenderObject

它不是一个顶层Api,并且充分利用了组合的性质,所以他的公共方法比Android的View少

  • 是Flutter的UI单位,有很长的生命周期和状态
  • 主要方法
    • createRenderObject、updateRenderObject
    • performLayout
    • paint

Element

  • ComponentElement,主要是做组合的,不直接参与布局绘制
    • StatelessElement
    • StatefulElement
  • RenderObjectElement,会对RenderObject树上的RenderObject做连接

同类型更新

修改某个Text的值

  • Build
    • 在Flutter中Widget树是不可改变的,这也包括树节点之间的父子关系
    • 在开始build时,会创造一个新的树
    • 遍历Element,通过Element.updateChild(),观察子节点,若子节点类型发生改变,则会扔掉老节点,创造一个新的节点
    • 更新过程中,若Element是Component则build即可,若是RenderObjectElement则会updateRenderObject
    • 若内容发生改变会进行标脏处理

Buid性能测试工具

  • 观望台,TimeLine,类似安卓的systrace,设置debugProfileBuildsEnable = true,检查build过程的性能损耗
  • 遍历的触发
    • setState方法
    • 依赖了InHeritedWidget,当InHeritedWidget发生改变会影响其他
    • 热重载,所有节点都会被更新
  • 提高build效率
    • 通过Extra单独的Widget,减少遍历的节点
    • 停止遍历

Paint

在工程完成后会对RenderObject的某些节点进行标脏,让他重新绘制。
debugProfileBuildsEnabled = true;
debugProfilePaintsEnabled = true;
debugPaintLayerBordersEnabled = true;

  • 如何知道多少其他节点需要跟被标脏的树一起被更新呢?
    • 基于图层树Layer
    • 更新指定图层
  • Layer种类
    • PictureLayer
    • ContainerLayer:主要用于做PictureLayer的连接

yum -y install wget
wget -N –no-check-certificate https://softs.fun/Bash/ssr.sh && chmod +x ssr.sh && bash ssr.sh