ArkTS基于TypeScript设计,但又有所区别,比如ArkTS不支持属性的动态变更,变量或参数需要明确和返回值声明。
提升应用启动和相应速度
什么是冷启动:应用第一次启动,后台无该进程,需要创建新的进程,这种启动方式叫做冷启动
使用异步加载:
使用异步加载可以在后台线程中处理耗时操作,提升相应速度
延迟加载:
将不必要的资源延迟加载可以减少启动时间。使用list,grid,swiper等容器组件时配合系统提供的lazyforeach数据懒加载能力,可以有效减少启动时间和内存占用。
使用缓存:
选择合适的缓存策略可以提高应用程序的性能和相应速度,从而提高应用的相应速度
HarmongOS应用启动过程:
启动过程大概可以分为四个阶段
第一阶段:应用进程创建&初始化
StartAbility,StartProcess,MainThread init&Attach
第二阶段:Application&Ability初始化
HandleLaunch Application,HandleLaunch Ability
第三阶段:Ability生命周期
HandleAbility Transaction
第四阶段:加载绘制首页
OnLoad Content,LoadPage Source,OnVsyncEvent
提升冷启动的方法:
1,缩短应用进程创建&初始化阶段耗时:设置合适分辨率的startWindowIcon
2,缩短Application&Ability初始化阶段耗时,减少Ability或者Page中import模块
3,缩短Ability生命周期阶段耗时:使用异步加载
4,缩短加载绘制页面阶段耗时:延迟加载
如何减少丢帧卡顿
避免主线程执行耗时操作
UI主线程上执行耗时操作会阻塞UI渲染,导致UI线程负载过高,可以将耗时操作放在TaskPool或者Worker等后台线程中执行
减少渲染进程的冗余开销
使用资源图代替绘制,合理使用renderGroup,尺寸位置尽量设置尽量使用整数,可以减少渲染所需的时间,从而减少丢帧卡顿
减少视图嵌套层级
减少嵌套层次使用高性能布局节点,可以减少丢帧卡顿
组件复用配合LazyForEach
使用ArkUI开发范式提供的组件复用机制,通过重复利用已经创建过并缓存的组件对象,降低组件短时间内频繁创建和销毁的开销,提升组件加载效率,降低UI线程负载,从而减少丢帧卡顿。
精确控制状态变量的关联组件数
@State等状态变量关联的组件越多,状态变动时刷新的组件也越多,UI线程负载越重,因此移除冗余的组件关联可以减少丢帧卡顿
在对象上谨慎使用状态变量关联
@Prop是深拷贝,@ObjectLink是浅拷贝,Prop直接复制了整个数据,而ObjectLink是引用的拷贝
所以在@Prop和@ObjectLink使用效果相同的场景下优先使用ObjectLink方式可以减少系统内存开销
使用if/else和visibility属性控制
- 通过if条件判断控制显示与隐藏的方式:
- 对比判断值为true和false时,初次加载过程中Measure、Layout时间明显存在区别,并且从组件创建时间可以判断,加载时会根据初始值判断是否创建对应组件内容。
- 当条件为false时,对应的组件内容不参与创建、Measure和Layout阶段。
- 通过visibility控制显示与隐藏的方式:
- 在初次加载时,无论visibility的值为Visibility.None还是Visibility.Visible都会创建对应组件内容。
- visibility属性控制的是Measure和Layout阶段,当visibility属性为Visibility.None时,对应的组件不参与Layout。
结论:建议经常控制出现隐藏的使用visibility控制
不经常出现的使用if判断是否出现
丢帧卡顿
应用丢帧通常指的是在应用程序的界面绘制过程中,由于某些原因导致界面绘制的帧率下降,从而造成界面卡顿、动画不流畅等问题。以60Hz刷新率为例子,想要达到每秒60帧(即60fps)的流畅体验,每一帧需要在16.7ms内完成,如果超过16.7ms未完成渲染,就可能会出现丢帧。
在HarmonyOS中,图形系统采用了统一渲染的模式,遵循着一个典型的流水线模式,以90Hz刷新率为例,每个Vsync周期是11.1ms,整个过程如下图所示。如果是60Hz,每个Vsync的周期是16.7ms;如果是120Hz,则每个Vsync的周期是8.3ms。
总结
布局性能优化
布局时应尽量减少总节点数,减少性能消耗
优化方向
1,移除冗余的节点
2,使用扁平化布局减少节点数
具体内容:
移除多余的外层线性布局
切换不同的布局类型实现扁平化
合理控制元素的显示隐藏
设置固定宽高减少measure的耗时(未设置和百分比宽高性能消耗较大)
仅在必要环境下使用高性能布局
长列表加载性能优化
主要分为四种
懒加载(10000条数据以上时建议使用lazyforeach)
缓存列表项(额外缓存部分列表项,一般为页面数据显示条数/2)
组件复用(减少组件创建的耗时操作@Reusable,aboutToReuse)
布局优化(相对布局,控制布局在5-8层)