
网罗开发小红书、快手、视频号同名大家好我是展菲目前在上市企业从事人工智能项目研发管理工作平时热衷于分享各种编程领域的软硬技能知识以及前沿技术包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。图书作者《ESP32-C3 物联网工程开发实战》图书作者《SwiftUI 入门进阶与实战》超级个体COC上海社区主理人特约讲师大学讲师谷歌亚马逊分享嘉宾科技博主华为HDE/HDG我的博客内容涵盖广泛主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告同时也会提供产品优缺点分析、横向对比并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。展菲您的前沿技术领航员 大家好我是展菲 全网搜索“展菲”即可纵览我在各大平台的知识足迹。每周定时推送干货满满的技术长文从新兴框架的剖析到运维实战的复盘助您技术进阶之路畅通无阻。文章目录引言一、为什么帧率会抖动二、稳定帧率的核心指标三、鸿蒙游戏最大的性能杀手四、第一种优化状态批量更新五、第二种优化Store拆分六、第三种优化避免频繁创建对象七、第四种优化UI组件拆分八、第五种优化减少无意义动画九、System 优化比 UI 优化更重要十、AISystem 分帧优化 Demo十一、HUD优化 Demo十二、终极方案System Store 分层十三、一个关键认知升级总结引言很多开发者第一次做鸿蒙游戏时对性能优化的理解非常简单掉帧了 ↓ 看看CPU ↓ 优化代码或者动画卡顿 ↓ 减少组件然后问题似乎解决了一部分但当项目变大以后角色越来越多 特效越来越多 状态越来越多 UI越来越复杂你会发现一个现象CPU并没有跑满但帧率依然不稳定。例如60fps 58fps 42fps 60fps 35fps玩家感受到的不是平均帧率而是Frame Time帧时间波动所以真正的优化目标不是跑得快。而是跑得稳。这篇文章我们从鸿蒙游戏架构角度聊聊如何实现稳定帧率而不是虚假的高帧率。一、为什么帧率会抖动很多人认为帧率低 CPU性能差实际上大多数情况不是真正的问题通常来自渲染抖动 状态抖动 布局抖动 对象创建 垃圾回收例如setInterval((){store.hp--store.goldstore.exp})看起来很简单但实际上一次状态变化 ↓ 触发UI更新 ↓ 重新布局 ↓ 重新绘制如果频率过高FPS开始波动二、稳定帧率的核心指标很多项目盯着FPS其实更应该看Frame Time例如60FPS16.6ms意味着每一帧必须在16.6ms内完成如果某一帧30ms玩家就会感受到卡顿即使平均FPS还是60所以稳定的16ms比偶尔冲到120FPS更重要。三、鸿蒙游戏最大的性能杀手不是动画而是状态更新风暴。例如store.hp--store.mp--store.expstore.goldstore.level连续触发5次状态通知最终5次UI刷新四、第一种优化状态批量更新错误写法store.hp-10store.exp20store.gold100每次都通知。推荐store.update((){store.hp-10store.exp20store.gold100})思想一次通知 多次修改效果减少重绘 减少Diff五、第二种优化Store拆分很多项目GameStore里面玩家 敌人 任务 背包 技能全放一起结果金币变化 整个UI刷新推荐PlayerStore SkillStore MissionStore InventoryStore例如PlayerHUD ↓ PlayerStoreSkillHUD ↓ SkillStore这样局部刷新性能提升非常明显。六、第三种优化避免频繁创建对象很多人喜欢constenemy{x,y,hp}每帧创建例如update(){this.enemy{x:100,y:200}}问题频繁GC导致Frame Spike也就是突然掉帧推荐enemy.x100enemy.y200直接复用。七、第四种优化UI组件拆分很多人写GamePage里面地图 玩家 Boss 背包 任务 商城全在一个组件结果任何变化 整个页面重新计算推荐PlayerHUD SkillHUD MiniMapHUD BossHUD独立组件例如Componentstruct BossHUD{}这样Boss变化 只刷新BossHUD八、第五种优化减少无意义动画很多项目喜欢缩放动画 透明度动画 位移动画同时执行例如.animate({duration:300})几十个一起跑结果GPU压力上升优化原则重要信息动画 保留 装饰动画 减少九、System 优化比 UI 优化更重要很多开发者疯狂优化Text Image Button但忽略BattleSystem AISystem实际上逻辑层才是真正的大头例如for(enemyofenemies){pathFinding()}100个敌人100次寻路直接卡死。正确方案分帧执行例如frame%50才更新AI。十、AISystem 分帧优化 Demo错误updateEnemies(){enemies.forEach(enemy{enemy.updateAI()})}优化updateEnemies(frame:number){enemies.forEach((enemy,index){if((frameindex)%50){enemy.updateAI()}})}效果AI负载均匀分散十一、HUD优化 Demo错误Text(${store.hp})每次变化刷新优化ObservedplayerStore局部绑定。Componentstruct HpBar{}单独组件结果HP变化 只刷新血条十二、终极方案System Store 分层真正的大型项目最终会变成Store ↓ System ↓ HUD ↓ UI其中Store 负责状态 System 负责计算 HUD 负责展示 UI 负责交互这样逻辑与渲染彻底解耦十三、一个关键认知升级初学者关注FPS是多少进阶开发者关注Frame Time是否稳定高手关注为什么这一帧变慢因为真正影响体验的从来不是平均帧率而是最慢的那几帧。总结鸿蒙游戏渲染优化的核心思路减少状态通知 拆分Store 拆分HUD 控制对象创建 分帧执行System最终形成Input ↓ System ↓ Store ↓ HUD ↓ UI如果用一句话总结鸿蒙游戏优化的重点不是“让每一帧更快”而是“让每一帧都稳定”。