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

一、性能优化的三个方面

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

二、各方面具体重点内容

(一)感知流畅
  • 视觉感知优化:在用户操作时及时给予视觉反馈响应,如添加单击效果、转场缩放、加载进度条等动画元素,操作完成后动画以渐变消失等友好方式退出。
  • 转场场景动效 :
    • 出现 / 消失转场:对新增、消失控件实现动画效果。
    • 导航转场:对应页面路由切换的动画效果。
    • 模态转场:新界面覆盖旧界面的动画效果。
    • 共享元素转场:对相同或相似元素做过渡动画。
    • 页面转场动画(不推荐):可自定义但推荐使用导航转场和模态转场。
    • 旋转屏动画增强:配置渐隐和渐现转场效果。
  • 动画时长设置:合理设置 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 函数中延迟执行。
相关推荐
wo_jack3 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
聪明的笨猪猪6 小时前
AI应用架构选型:架构师的核心决策困境与权衡
经验分享·面试·架构
行者-全栈开发6 小时前
【鸿蒙心迹】国际化 i18n 与多语言资源管理实战(HarmonyOS 7.x)
ui·华为·重构·国际化·harmonyos·多语言
疯华整猫8 小时前
被杀掉之后:我把 Android 的「唤起 + 常驻」重做了一遍
前端·面试·架构
OH_TPC8 小时前
HarmonyOS APP开发---"云客服"远程视频客服App,需要用到这个库
harmonyos
nice_lcj5208 小时前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
岁月宁静20 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
Dream it possible!1 天前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
逆回1 天前
给鸿蒙手机做一只 3D 宠物:五个把我卡住的问题
harmonyos
钉先生贾1 天前
性能、体积与稳定性:怎样写出可信的适配结论
华为·harmonyos