HarmonyOS 性能优化

harmonyos,性能,优化 · 浏览次数 : 187

小编点评

**合理使用 Transition 来获得更好的性能组件转场动画:** * 使用 transition 动画可以减少动画前后属性更新的次数,从而减少性能开销。 * 通过改变透明度属性并使用 transition 来隐藏和显示组件,可以节省性能。 * 使用图形变换属性动画可以避免重新绘制组件的布局,从而减少性能开销。 * 使用同一个 animateTo 闭包中多个动画参数可以减少组件更新的次数。 * 在执行多个 animateTo 之间统一更新状态变量可以避免在执行动画之间产生冗余的状态更新。 **其他性能优化技巧:** * 使用数据懒加载技术来加载和渲染长列表数据。 * 设置 List 的宽高可以确保只布局 List 显示区域内的子组件,从而提高性能。 * 使用条件渲染替代显隐控制可以避免组件的重新创建过程。 * 使用 Column/Row 替代 Flex 来避免二次布局带来的性能问题。 * 减少应用滑动白块可以通过增大 List/Grid 控件的 cachedCount 参数来解决。 * 减少状态变量关联的组件数可以优化组件刷新效率。 * 使用 HiDumper 工具查询状态变量关联的组件数以进行性能优化。

正文

如何合理使用动效来获得更好的性能

  1. 组件转场动画使用 transition

    • 推荐使用转场动画(transition)而不是组件动画(animateTo),因为 transition 只需要在条件改变时更新一次,而 animateTo 需要在动画前后做两次属性更新,导致性能开销更大。
    • 反例:通过改变透明度属性并使用 animateTo 来隐藏和显示组件。
    • 正例:直接使用 transition 动画,通过改变透明度实现组件的出现与消失。
 
  1. 组件布局改动时使用图形变换属性动画

    • 当需要改动组件的布局显示时,推荐使用图形变换属性(如平移、旋转、缩放)而不是改动布局属性(如 width、height、layoutWeight),因为图形变换不会重新触发布局,从而减少性能开销。
    • 反例:通过设置布局属性 width 和 height 来改变组件大小。
    • 正例:通过设置图形变换属性 scale 来改变组件大小。
 
  1. 动画参数相同时使用同一个 animateTo

    • 如果多个属性需要使用相同的动画参数进行动画处理,应该将它们合并到一个 animateTo 闭包中,以减少组件更新的次数。
    • 反例:将相同动画参数的状态变量更新放在不同的动画闭包中。
    • 正例:将相同动画参数的动画合并在一个动画闭包中。
 
  1. 多次 animateTo 时统一更新状态变量

    • 在执行多个 animateTo 之前,应该统一更新状态变量,避免在执行动画之间产生冗余的状态更新。
    • 反例:在两个 animateTo 之间更新状态变量。
    • 正例 1:在 animateTo 之前使用原始状态,让动画从原始状态过渡到指定状态。
    • 正例 2:在 animateTo 之前显式指定所有需要动画的属性初值,统一更新到节点中,然后再执行动画。

应用性能提升

1. 使用数据懒加载

 
在处理长列表数据时,传统的循环渲染方式会一次性加载所有列表元素,这会导致页面启动时间过长,影响用户体验,并增加服务器压力。为了解决这个问题,推荐使用 DataSource 来实现数据懒加载技术。通过懒加载,只有当数据进入可视区域时才加载和渲染,这样可以显著提高页面的响应速度和性能。
 

2. 设置 List 组件的宽高

 
在使用 Scroll 容器组件嵌套 List 组件加载长列表时,如果没有指定 List 的宽高尺寸,List 将会布局其所有子组件,这会导致性能问题。通过设置 List 的宽高,可以确保只布局 List 显示区域内的子组件,从而提高性能。
Scroll 嵌套 List 时:
  • List 没有设置宽高,会布局 List 的所有子组件。
  • List 设置宽高,会布局 List 显示区域内的子组件。
  • List 使用 ForEach 加载子组件时,无论是否设置 List 的宽高,都会加载所有子组件。
  • List 使用 LazyForEach 加载子组件时,没有设置 List 的宽高,会加载所有子组件,设置了 List 的宽高,会加载 List 显示区域内的子组件。

3. 使用条件渲染替代显隐控制

 
使用 visibility 属性控制组件的显隐状态时,即使组件不可见,它仍然会被重新创建,这会造成性能损耗。通过使用 if 条件渲染,可以避免组件的重新创建过程,从而提升性能。
 

4. 使用 Column/Row 替代 Flex

 
Flex 容器组件在默认情况下存在 shrink 属性,这可能导致二次布局,影响页面渲染性能。通过使用 Column 和 Row 组件替代 Flex,可以避免二次布局带来的性能问题。
 

5. 减少应用滑动白块

 
在应用中,滑动白块是一个常见的性能问题。通过增大 List/Grid 控件的 cachedCount 参数,可以预加载更多的 item,减少白块的出现。同时,如果需要请求网络图片,可以提前下载内容,以减少滑动时的白块现象。

状态管理优化

以下是文档中提到的一些关键点:
 
  1. 使用@ObjectLink 代替@Prop 减少不必要的深拷贝
在父子组件间传递数值时,如果子组件不需要改变状态变量的值,使用@ObjectLink 比@Prop 更优,因为@Prop 会导致深拷贝,增加性能开销。
 
  1. 不使用状态变量强行更新非状态变量关联组件:开发者应避免通过改变自定义的 UI 状态变量来带动常规变量的更新,而应将相关成员变量用@State 装饰,以便框架能够检测状态变化并触发 UI 更新。
 
  1. 精准控制状态变量关联的组件数:建议每个状态变量关联的组件数少于 20 个,以减少不必要的组件刷新,提高效率。
 
  1. 合理控制对象类型状态变量关联的组件数量:如果一个复杂对象被定义为状态变量,需要合理控制其关联的组件数,避免“冗余刷新”。
 
  1. 查询状态变量关联的组件数:可以使用 HiDumper 工具查看状态变量关联的组件数,进行性能优化。
 
  1. 避免在 for、while 等循环逻辑中频繁读取状态变量:应该在循环外面读取状态变量,避免在循环逻辑中频繁读取,以提高性能。
 

避免冗余操作

 
  1. 避免在高频回调中进行冗余操作:在处理如滚动事件、触摸事件等高频回调时,应避免在回调函数内部执行冗余的日志记录、Trace追踪和耗时操作。这些操作会严重影响应用的性能和响应速度。
 
  1. 删除冗余Trace和日志打印:在开发阶段,日志和Trace追踪是重要的辅助工具,但在发布版本中应移除这些冗余的输出,以避免不必要的性能开销。
 
  1. 避免设置冗余的系统回调监听:如果回调函数体内不包含任何业务逻辑代码,应将其删除。注册但未使用的回调会消耗系统资源,影响程序运行效率。
 

与HarmonyOS 性能优化相似的内容:

HarmonyOS 性能优化

如何合理使用动效来获得更好的性能 组件转场动画使用 transition: 推荐使用转场动画(transition)而不是组件动画(animateTo),因为 transition 只需要在条件改变时更新一次,而 animateTo 需要在动画前后做两次属性更新,导致性能开销更大。 反例:通过改变透

HarmonyOS 鸿蒙隔离层设计

在软件开发中,底层库的更换或升级是常见的需求,这可能由性能提升、新功能需求或安全性考虑等因素驱动。为了降低迁移成本,良好的设计模式至关重要。 在版本迭代过程中,网络请求库可能会经历从A到B再到C的演进。为了实现业务层的无感切换,需要在各个请求库和业务代码之间封装隔离代码,以实现第三方网络库的灵活更换

鸿蒙HarmonyOS实战-窗口管理

前言 窗口管理是指计算机操作系统中管理和控制窗口的一种机制。窗口管理器负责处理窗口的创建、关闭、移动、调整大小等操作,并且决定窗口的位置、层级、是否可见、是否接收用户输入等属性。窗口管理器还负责绘制窗口的外观和边框,并提供用户与窗口交互的方式,如鼠标点击、键盘输入等。窗口管理器可以通过图形用户界

HarmonyOS 应用生命周期有哪些? 按返回键会调用哪些生命周期?

UIAbility 生命周期: onCreate :页面初始化,变量定义,资源加载。 onWindowStageCreate:设置 UI 界面加载、设置 WindowStage 的事件订阅。 onForeground:切换至前台,申请系统需要的资源,或者重新申请在 onBackground()中释放

App如何利用推送消息有效实现拉新促活?

对于大多数App来说,如何快速建立与用户的联系、提高用户活跃度、提升用户转化率,是产品运营过程中十分关心的问题,在常见的运营手段中,Push推送消息以其高性价比成为首选策略。但在实际运营过程中,推送消息的打开率和转化率远远达不到预期,App日活难以提升。那么如何才能有效提高打开和转化率,快速实现Ap

HiAI Foundation开发平台,加速端侧AI应用的智能革命

如果您是一名开发者,正在寻找一种高效、灵活且易于使用的端侧AI开发框架,那么HarmonyOS SDKHiAI Foundation服务(HiAI Foundation Kit)就是您的理想选择。 作为一款AI开发框架,HiAI Foundation不仅提供强大的NPU计算能力和丰富的开发工具,还提

解决卡顿发热,超帧技术焕发中重载游戏动力

近几年,中国手游市场规模不断扩大,开发者通过在画面、玩法等方面的持续创新和打磨,推出更加精品化的产品。然而愈发精美的画质和复杂的玩法,也给硬件带来超高的负载,导致玩家在游戏过程中,频繁出现掉帧卡顿、发烫、续航差等体验降低的现象。 HarmonyOS SDK 图形加速服务(Graphics Accel

小窗口大魔力,实况窗服务实时掌控重要信息变化

移动互联网时代,各种以用户为中心的App如春笋般涌现,满足了用户在购物、导航、娱乐等不同场景下的需求,不同程度上丰富了用户的日常生活。然而,随着App种类的激增,用户在享受多样化服务的同时,也面临着多任务管理的挑战。 比如,用户正沉浸在游戏或追剧中时,能否想起并打开App查看一下:不久前点的外卖是否

美团携手HarmonyOS SDK,开启便捷生活新篇章

华为开发者大会(HDC 2024)于6月21日在东莞松山湖拉开序幕,通过一系列精彩纷呈的主题演讲、峰会、专题论坛和互动体验,为开发者们带来了一场知识与技术的盛宴。6月23日,《HarmonyOS开放能力,使能应用原生易用体验》分论坛成功举办,美团作为鸿蒙原生应用开发中的优秀案例,受邀出席了此次活动。

加速鸿蒙生态共建,蚂蚁mPaaS助力鸿蒙原生应用开发创新

6月21日-23日,2024华为开发者大会(HDC 2024)如期举行。在22日的【鸿蒙生态伙伴SDK】分论坛中,正式发布了【鸿蒙生态伙伴SDK市场】,其中蚂蚁数科旗下移动开发平台mPaaS(以下简称:蚂蚁mPaaS)在论坛中提出,已正式推出鸿蒙原生Beta版能力集,覆盖手机、IoT等终端,企业、机