当前位置: 首页 > news >正文

应用性能优化实践(三)减少丢帧卡顿

一、减少丢帧卡顿的方法

        1、避免在主线程上执行耗时的操作

        UI主线程是HarmonyOS应用中最重要的线程之一,在主线程上执行耗时的操作会阻塞UI渲染,从而导致UI主线程的负载过高。因此,可以将耗时操作放在TaskPool或Worker等后台线程中执行。 

        2、减少渲染进程的冗余开销

        使用资源图代替绘制、合理使用renderGroup、尺寸位置设置尽量使用整数,可以减少渲染所需的时间,从而减少丢帧卡顿。 

        3、减少视图嵌套层级

        应用开发中的用户界面(UI)布局是用户与应用程序交互的关键部分。不合理的布局越多,视图的创建、布局、渲染等流程所需的时间就越长。因此,减少嵌套层次或者使用高性能布局节点,可以减少丢帧卡顿。

        4、组件配合使用LazyForEach

        使用ArkUI开发范式提供的组件复用机制,通过重复利用已经创建过并缓存的组件对象,降低组件短时间内频繁创建和销毁的开销,提升组件加载效率,降低UI线程负载,从而减少丢帧卡顿。

        5、精确控制状态变量的关联组件数

        @state等状态变量关联组件越多,状态数据变更时刷新的组件越多,UI线程负载越重,因此移除冗余的组件可以减少丢帧卡顿。

        6、在对象上谨慎使用状态变量关联

二、减少渲染进程的冗余开销

        1、动画场景

        (1)组件转场动画推荐使用transition

        (2)动画参数相同时使用同一个animateTo

        由于每次animateTo都需要进行动画对比,使用多个animateTo的性能不如只使用一个animateTo。特别针对设置在同一组件的属性,能减少该组件更新的次数。

        (3)多次animateTo时统一更新状态变量

        animateTo会将执行动画闭包前后的状态进行对比,对差异部分进行动画。为了对比,会在执行animateTo的动画闭包之前,将所有变更的状态变量和脏节点都刷新。如果多个animateTo之间存在状态更新,会导致执行下一个animateTo之前又存在需要更新的脏节点,可能会造成冗余更新。

        2、合理使用RenderGroup

        首次绘制组件时,若组件被标记为rendergroup状态,将对组件以及其子节点进行离屏绘制,将绘制结果结果进行缓存,此后当需要重新绘制组件时,就会优先使用缓存而不必重新绘制,从而降低绘制负载,优化渲染性能。

        3、减少视图层级嵌套

        嵌套层级越深,会有更大的系统内存开销。因此在开发过程中,要尽可能减少布局嵌套,是布局更加扁平化。例如RelativeContainer可以根据锚点来进行低嵌套层级复杂布局,而List和Grid等高级组件不但能使布局扁平化,而且支持懒加载等提升性能的方法,是更加推荐的布局方式。

        4、组件复用

        推荐场景:

        滑动场景下对同一类自定义组件进行频繁的创建与销毁;

        反复切换条件渲染的控制分支,且控制分支中的组件子树结构相同。

        5、精确控制状态变量的关联组件数

        不推荐使用更新单个状态变量的形式自行控制多个组件更新时机(命令式)。

        推荐使用状态变量和组件---绑定的方式,以数据的变更驱动组件的刷新(声明式)。

        6、精确控制状态变量的关联组件数

        合理控制状态更新范围,避免关联刷新较大范围或者渲染较慢的组件。

        7、在对象上谨慎使用状态变量关联

        理解@Prop和@ObjectLink的区别:@Prop是深拷贝,@ObjectLink是浅拷贝

        所以在@Prop和@ObjectLink使用效果相同的场景下,优先使用@ObjectLink的方式减少系统内存开销。


http://www.mrgr.cn/news/29234.html

相关文章:

  • 从0开始学习机器学习--Day24--核函数
  • 【activiti工作流源码集成】springboot+activiti+mysql+vue+redis工作流审批流集成整合业务绑定表单流程图会签驳回
  • 网络远程操控
  • 【MQTT】代理服务比较RabbitMQ、Mosquitto 和 EMQX
  • FastGPT部署通义千问Qwen和智谱glm模型|OneAPI配置免费的第三方API
  • 【Linux】网络编程3
  • Java基础之-多线程
  • MySQL函数:字符串函数
  • Python 项目实践:简单的计算器
  • <<编码>> 第 14 章 反馈与触发器(1)--振荡器 示例电路
  • 蓝卓标杆客户镇洋发展,荣获IDC中国未来企业大奖
  • matplotlib添加字体
  • python 实现double factorial recursive双阶乘递归算法
  • html知识点框架
  • matlab绘制不同区域不同色彩的图,并显示数据(代码)
  • 怎么能让电脑屏幕显示多个监控画面?电脑监控如何多画面显示?
  • 针对项目可能用到的域名做了dns预解析和优化
  • CSP-S 2023 提高级 第一轮(初赛) 完善程序(2)
  • pywebview 中错误使用async
  • Vue3中shallowRef和ref区别
  • 最新简洁大方的自动发卡网站源码/鲸发卡v11.61系统源码/修复版
  • IBM中国研发部裁员:全球化背景下的中国IT产业挑战与机遇
  • 本地虚拟机centos7安装达梦8数据库
  • uni-app 聊天界面滚动到消息底部
  • 大模型微调基本概念指北,零基础入门到精通,收藏这一篇就够了
  • Maven的详细解读和配置