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

鸿蒙面试 --- 性能优化(精简版)

一、性能优化的三个方面

  • 感知流畅:通过合理运用动画提升用户对应用操作的感知流畅度,同时避免因动画滥用导致性能下降。涵盖视觉感知优化、转场场景动效感知流畅(如出现 / 消失转场、导航转场、模态转场、共享元素转场等),以及合理设置动画时长、使用连贯动画等要点。
  • 渲染性能:从控制渲染范围、减少布局节点、优化组件绘制、控制状态刷新、优化动画帧率等方面着手,旨在缩短页面加载和布局渲染时长,提升应用的渲染效率,减少内存占用和卡顿现象。
  • 运行性能:涉及使用并发能力、提前加载资源、提高运行效率、减少耗时操作、延时触发操作等,以充分利用系统资源,减少用户等待时间,提升应用整体运行的流畅性和效率。

二、各方面具体重点内容

(一)感知流畅

  • 视觉感知优化:在用户操作时及时给予视觉反馈响应,如添加单击效果、转场缩放、加载进度条等动画元素,操作完成后动画以渐变消失等友好方式退出。
  • 转场场景动效
    • 出现 / 消失转场:对新增、消失控件实现动画效果。
    • 导航转场:对应页面路由切换的动画效果。
    • 模态转场:新界面覆盖旧界面的动画效果。
    • 共享元素转场:对相同或相似元素做过渡动画。
    • 页面转场动画(不推荐):可自定义但推荐使用导航转场和模态转场。
    • 旋转屏动画增强:配置渐隐和渐现转场效果。
  • 动画时长设置:合理设置 Tabs 组件、Swiper 组件、页面间转场等的动画时长,避免过长时延影响用户点击完成时延。
  • 连贯动画使用:通过多种连贯动画让用户感受到应用快速响应。
(二)渲染性能
  • 控制渲染范围
    • 合理控制元素显示与隐藏:运用 Visibility.None、if 条件判断等手段。
    • 懒加载:如 LazyForEach 技术,按需求加载数据或资源,可设置 cachedCount 缓存数据,适用于长列表等场景。
    • 组件复用:针对不同复用类型(标准型、有限变化型、组合型、全局型、嵌套型)采用相应复用思路,减少创建新节点。
    • 分帧渲染:应对页面内复杂列表结构,减轻组件负载。
  • 减少布局节点
    • 优先使用 @Builder 方法:在不涉及状态变量和自定义生命周期时替换自定义组件。
    • 合理使用布局容器组件:选用合适布局,减少使用性能差的布局组件。
    • 精简节点数:移除冗余节点、使用扁平化布局,避免给自定义组件添加属性产生多余节点,减少无用容器组件嵌套。
  • 优化组件绘制
    • 避免高耗时操作:不在自定义组件生命周期内执行高耗时操作,如 aboutToAppear () 函数中。
    • 按需注册组件属性:避免单个组件设置大量属性。
    • 减少布局计算:非自适应情况下给定组件宽高数值。
  • 控制状态刷新
    • 避免不必要的状态变量使用:合理使用状态变量,用临时变量替换可减少渲染。
    • 最小化状态共享范围:按需求选择合适装饰器实现最小化共享范围。
    • 减少参数层层传递:避免状态在层级相差较大的组件间层层传递。
    • 精细化拆分复杂状态:避免将过多状态存入 AppStorage。
    • 集中化状态修改逻辑:将相同的状态修改逻辑集中到单个函数。
    • 精准控制组件刷新:使用 @Watch 装饰器监听数据源或通过 EventHub、Emitter 实现事件发布订阅。
  • 优化动画帧率
    • 使用系统动画接口:可提供流畅动画效果,减少丢帧率。
    • 使用图形变换属性变化组件:减少布局计算和重绘操作。
    • 合理使用 animateTo:参数相同时放在同一动画闭包执行,多次动画操作时统一更新状态变量。
    • 使用 renderGroup 缓存动效:解决大量应用动效组件的卡顿问题。
(三)运行性能
  • 使用并发能力
    • 多线程能力:将高耗时任务用多线程处理或改为异步并发、延后处理,如 ArkTS 提供的 TaskPool 与 Worker 方案。
    • 异步能力:利用 Promise 和 async/await 实现异步并发,适用于单次 I/O 任务。
    • 多线程间通信:注意对象跨线程传递时的序列化 / 反序列化问题,可使用 Sendable 对象实现引用传递。
  • 提前加载资源
    • 网络请求优化:提前发起网络请求,减少因网络请求时长导致的页面跳转时延。
    • Web 组件相关:预连接、预加载、预渲染 Web 组件,提升页面启动和响应速度。
    • 预下载优化 Image 白块:提前缓存网络图片,减少白块出现时长。
  • 提高运行效率
    • 变量声明:初期不变的变量用 const 声明,明确 number 类型初始化值,非跨语言场景少用 ESObject。
    • 属性访问:将全局变量存储为局部变量减少属性查找,选取合适的类属性访问修饰符。
    • 数值计算与数据结构:纯数值计算用 TypedArray,选取合适数据结构如 Record、HashMap 提高效率。
    • 减少嵌套导出 / 导入方式:按需引用变量,减少全量导出 / 引用,降低依赖模块解析耗时。
  • 减少耗时操作
    • 避免主线程冗余操作:避免不必要、重复且无实质贡献的操作。
    • 避免高频回调执行耗时操作:防止在高频回调接口中执行耗时操作。
    • 避免使用耗时接口:合理使用系统提供的接口,如数据库调用采用异步接口。
  • 延时触发操作
    • 动态加载与延迟加载:通过动态 import 或 Lazy-Import 在需要时加载模块,节省冷启动资源。
    • 延迟执行资源释放操作:将资源关闭和释放操作放在 setTimeout 函数中延迟执行。

http://www.kler.cn/a/412607.html

相关文章:

  • Paddle Inference部署推理(八)
  • Pgsql:json字段查询与更新
  • 如何使用OCR技术批量识别图片中的文字并重命名文件,OCR 技术批量识别图片中的文字可能出现的错误
  • 34 基于单片机的指纹打卡系统
  • 如何编写一个 Vue 3 应用:模板插值示例
  • HTTP 缓存技术
  • K8s调度器扩展(scheduler)
  • 小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现
  • C语言中使用动态内存
  • SpringBoot集成minio,并实现文件上传
  • Flutter:封装发送验证码组件,注册页使用获取验证码并传递控制器和验证码类型
  • java内存管理介绍
  • 选择正确的网络代理模式:全面指南与实际应用示例
  • SpringBoot框架助力欢迪迈手机商城快速开发
  • C++11 http服务端和客户端库cpp-httplib
  • react 前端最后阶段静态服务器启动命令
  • win、linux等环境下python输出cpu、gpu、avx等硬件信息
  • WindTerm 开源工具基础使用
  • 【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象
  • Django在fitler过滤不等于的条件
  • 移门缓冲支架:保护您的家
  • 欢迪迈手机商城:SpringBoot框架的缓存机制
  • 基于SSM的学科竞赛管理系统
  • 前端编程训练 异步编程篇 请求接口 vue与react中的异步
  • 决策树分类算法【sklearn/决策树分裂指标/鸢尾花分类实战】
  • git 远端删除分支本地同步删除