ArkTs组件嵌套优化

200 阅读3分钟

ArkUI框架组件渲染流程

image.png

如上图所示,可以看到ArkUI框架的执行顺序:

  1. 执行ArKTS中的UI描述信息,通过UI描述API创建后端的页面节点树FrameNode树,其中包含了处理UI组件属性更新、布局测算、事件处理等业务逻辑;
  2. 通过FrameNode生成当前的界面描述数据结构——渲染树RenderTree,RenderTree描述了具体的元素在屏幕上的布局信息,包含大小、位置以及一些其他属性;
  3. 最后渲染线程会根据RenderTree的信息执行相应的绘制工作。

组件过度嵌套对性能的影响

从ArkUI框架的执行流程上分析,组件的过度嵌套会导致节点树深度过高,由于对节点树的遍历方式为深度优先遍历,所以节点树深度过高则会影响性能,节点树应更更趋向于扁平化。

从自定义组件的生命周期的角度上分析,如果自定义组件过度嵌套,则会有大量的生命周期函数需要执行,消耗性能。

优化方式

一. 优先使用@Builder方法代替自定义组件

自定义组件在实际应用开发场景中更加通用、灵活。自定义构建函数(@Builder)由于不支持定义变量和生命周期等限制,在使用场景上灵活性受限,多用在插槽或系统提供的组件/方法里面属性传值类型为Builder类型场景中。

由于@Builder不涉及生命周期,在自定义组件大量嵌套的场景中,更加轻量级的@Builder在性能方面更加出色。 当自定义组件不涉及到状态变量和自定义生命周期时,可以优先使用@Builder替换自定义组件,提升性能。

二. 选择合适的布局组件

复杂布局提供了场景化的能力,解决一种或者多种布局场景。但是在一些场景下,不恰当的使用这些高级组件,可能带来更多的性能消耗。

优化策略:

  • 在相同嵌套层级的情况下,如果多种布局方式可以实现相同布局效果,优选低耗时的布局,如使用Column、Row替代Flex实现相同的单行布局;
  • 在能够通过其他布局大幅优化节点数的情况下,可以使用高级组件替代,如使用RelativeContainer替代Row、Column实现扁平化布局,此时其收益大于布局组件本身的性能差距;
  • 仅在必要的场景下使用高耗时的布局组件,如使用Flex实现折行布局、使用Grid实现二维网格布局等;

三. 删除无用的Stack/Column/Row嵌套,移除冗余节点

在组件嵌套的情况中,可以找到一些无用的容器组件嵌套。在考虑组件嵌套优化中,可以删除掉无用容器组件嵌套,移除冗余节点,从而避免冗余节点对性能的消耗。

四. 将自定义组件的属性移至自定义组件内部

给自定义组件添加属性时,实际上是给自定义组件套了一层不可见的组件,而给自定义组件添加的属性,实际上也是绑定在这层不可见的组件上的。所以,给自定义组件添加属性与自定义组件内部添加属性二者相比,自定义组件内部添加属性会少一层不可见组件,使得总节点数量降低,从而可以提升性能。

官方连接: developer.huawei.com/consumer/cn…