
网罗开发 (小红书、快手、视频号同名)
大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。
每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
文章目录
-
- 引言
- 一、多端一致性到底是什么?
- 二、为什么会出现状态漂移?
- 三、传统方案为什么难维护?
- 四、多端一致性的核心原则
- [五、为什么 Store 比 UI 更重要?](#五、为什么 Store 比 UI 更重要?)
- 六、同步状态,不同步界面
- [七、System 才是真正的一致性核心](#七、System 才是真正的一致性核心)
- [八、Store + System 才是完整同步方案](#八、Store + System 才是完整同步方案)
- 九、输入同步比状态同步更高级
- [十、InputSystem 的价值](#十、InputSystem 的价值)
- [十一、一个简单 Demo](#十一、一个简单 Demo)
- 十二、如何避免网络延迟导致不同步?
- 十三、鸿蒙多端场景的优势
- 十四、状态快照同步
- 十五、一个关键认知升级
- 总结
引言
很多开发者第一次做鸿蒙游戏时,对"多端互通"的理解非常简单:
text
手机登录
↓
PC登录
↓
读取同一个账号
于是觉得:
这不就是同步存档吗?
实际上完全不是,真正的多端游戏会遇到更复杂的问题:
text
手机正在战斗
PC同时登录
手机背包变化
平板同步显示
玩家升级
多个设备同时更新
这时候问题就来了:
如何保证所有设备看到的是同一个游戏世界?
很多项目做到后面会出现:
text
手机等级:20
PC等级:19
或者:
text
手机金币:1000
PC金币:1200
这就是经典的:
状态漂移(State Drift)
而多端一致性的本质,就是解决这个问题。
一、多端一致性到底是什么?
很多人认为:
text
同步数据
=
多端一致
实际上:
text
同步数据
只是第一步
真正的一致性应该是:
text
任意设备
看到同一个状态
执行同一个规则
得到同一个结果
例如,玩家攻击怪物:
text
伤害:100
手机看到:
text
怪物HP = 900
PC看到:
text
怪物HP = 900
平板看到:
text
怪物HP = 900
这才叫一致。
二、为什么会出现状态漂移?
先看一个常见错误,手机:
ts
store.gold += 100
PC:
ts
store.gold += 100
同时执行,最终:
text
到底加一次?
还是加两次?
没人知道,这就是竞争条件问题,结果设备状态不同出现漂移。
三、传统方案为什么难维护?
很多项目采用以下模式:
text
设备A
↓
同步
↓
设备B
例如:
text
手机
↔
PC
直接同步。
当设备增加:
text
手机
平板
PC
TV
变成N²通信复杂度爆炸。
四、多端一致性的核心原则
真正的大型游戏不会同步 UI,也不会同步页面。而是同步:
状态(Store)
例如:
ts
class PlayerStore {
level = 20
hp = 1000
gold = 500
}
所有设备共享:
text
同一份状态
五、为什么 Store 比 UI 更重要?
手机:
text
技能栏在底部
PC:
text
技能栏在右侧
UI完全不同,但:
text
金币
等级
装备
应该一致,所以:
text
UI可以不同
Store必须一致
六、同步状态,不同步界面
很多团队最开始会尝试:
text
同步页面
同步组件
同步UI树
结果:
text
性能极差
维护困难
正确做法:
text
同步Store
例如:
json
{
"level": 20,
"gold": 500,
"hp": 1000
}
同步的是:
text
状态快照
而不是:
text
界面结构
七、System 才是真正的一致性核心
这是很多开发者忽略的地方。假设手机:
ts
damage = attack * 2
PC:
ts
damage = attack * 1.8
即使:
text
Store一致
最终结果也不同,因为:
text
规则不一致
所以:
多端一致性 = Store一致 + System一致
缺一不可。
八、Store + System 才是完整同步方案
最终结构:
text
Store
+
System
例如:
text
PlayerStore
BattleSystem
LevelSystem
InventorySystem
全部保持一致,这样:
text
同样输入
↓
同样规则
↓
同样结果
九、输入同步比状态同步更高级
很多大型游戏采用:
text
同步输入
而不是:
text
同步结果
例如,玩家点击:
text
ATTACK
发送:
json
{
"action":"ATTACK"
}
然后,所有设备执行:
ts
battleSystem.attack()
得到:
text
同样结果
这就是:
Deterministic Simulation(确定性模拟)
十、InputSystem 的价值
前面我们一直在讲:
text
Gesture
Keyboard
Mouse
最终进入:
text
InputSystem
这时候多端同步就变简单了。例如,手机:
text
TapGesture
PC:
text
MouseClick
最终统一:
text
ATTACK
然后:
text
InputSystem
↓
BattleSystem
↓
Store
执行。
十一、一个简单 Demo
定义输入:
ts
enum InputAction {
ATTACK,
MOVE
}
发送:
ts
network.send({
action: InputAction.ATTACK
})
接收:
ts
network.onMessage(msg => {
inputSystem.dispatch(msg.action)
})
执行:
ts
battleSystem.attack(store)
这样:
text
所有设备状态同步演化
十二、如何避免网络延迟导致不同步?
常见方案:
text
客户端预测
+
服务端校正
例如,玩家移动先本地移动,不用等服务器。
服务器确认,位置正确继续。
如果:
text
位置错误
执行:
text
回滚
修正状态,这是大部分实时游戏采用的方案。
十三、鸿蒙多端场景的优势
传统平台手机和 PC 往往是两套应用。
鸿蒙天然强调:
text
同一业务
多设备运行
因此:
text
Store
System
共享价值更大,结构最终变成:
text
Store
↑
│
BattleSystem
↑
│
InputSystem
/ | \
手机 PC 平板
十四、状态快照同步
除了实时同步,还需要:
text
断线恢复
设备切换
跨端登录
能力。例如,手机退出:
text
保存Store
PC登录:
text
恢复Store
代码示例:
ts
const snapshot = JSON.stringify(store)
save(snapshot)
恢复:
ts
Object.assign(
store,
JSON.parse(snapshot)
)
十五、一个关键认知升级
初学者理解:
text
多端同步
=
同步数据
进阶开发者理解:
text
同步状态
而大型游戏真正理解的是:
同步规则驱动下的状态演化过程。
因为最终决定世界变化的不是:
text
UI
也不是:
text
页面
而是:
text
System
总结
鸿蒙游戏实现多端一致性的核心架构:
text
Input
↓
InputSystem
↓
BattleSystem
LevelSystem
InventorySystem
↓
Store
↓
UI
核心原则:
text
UI可以不同
Store必须一致
Store一致还不够
System也必须一致
如果用一句话总结:
鸿蒙游戏的多端一致性,本质上不是"同步界面",而是让所有设备按照同一套 System 规则,演化出同一个游戏世界。