HarmonyOS 游戏 ECS 架构详解:为什么 Entity 不应该拥有逻辑?

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
文章目录
引言
很多开发者第一次设计游戏对象时,都会很自然地写出这种代码:
class Player {
hp = 100
move() {
}
attack() {
}
takeDamage() {
}
update() {
}
}
敌人:
class Enemy {
hp = 50
move() {
}
attack() {
}
ai() {
}
update() {
}
}
NPC:
class NPC {
move() {
}
talk() {
}
update() {
}
}
刚开始看起来没有问题。但是项目越来越大之后,你会发现:
Player 有几千行代码
Enemy 和 Player 大量重复
各种继承越来越复杂
AI、技能、动画耦合在一起
最后变成:
BaseCharacter
↓
PlayerCharacter
↓
MageCharacter
↓
FireMageCharacter
然后继续:
BossCharacter
EliteBossCharacter
FlyingBossCharacter
继承层数越来越深,最后自己都不敢改。于是很多成熟游戏引擎:
Unity DOTS
Unreal Mass
Bevy
Flecs
都开始采用 ECS(Entity Component System)。而 ECS 最重要的一条原则就是:
Entity 不拥有逻辑。
一、先说结论
在 ECS 中:
Entity
=
ID
Component
=
数据
System
=
逻辑
整个游戏:
Entity
↓
Component
↓
System
而不是:
Entity
↓
Logic
↓
Data
核心思想:
数据与行为彻底分离。
二、为什么 OOP 在大型游戏里越来越难维护?
很多人习惯这样:
class Player {
hp = 100
attack() {
}
move() {
}
jump() {
}
ai() {
}
update() {
}
}
问题是:
一个对象承担了太多职责
状态
行为
动画
AI
网络同步
碰撞
全塞进一个类。于是:
高耦合
不可复用
难扩展
增加一个 Buff,需要改:
Player
Enemy
Boss
增加一个技能,继续改:
所有 Character 类
慢慢整个项目进入:
类爆炸。
三、Entity 真正应该是什么?
很多人理解:
Entity = Player
其实不是。Entity 更像:
一个编号
例如:
class Entity {
id:number
}
玩家:
Entity #1
敌人:
Entity #2
子弹:
Entity #3
它自己什么都不知道。没有:
move()
attack()
jump()
只有:
id
是不是感觉有点奇怪?但这正是 ECS 最强大的地方。
四、真正拥有能力的是 Component
位置组件:
class TransformComponent {
x = 0
y = 0
}
生命组件:
class HPComponent {
hp = 100
}
攻击组件:
class AttackComponent {
damage = 20
}
速度组件:
class SpeedComponent {
speed = 10
}
玩家:
Entity #1
Transform
+
HP
+
Attack
+
Speed
敌人:
Entity #2
Transform
+
HP
+
Attack
子弹:
Entity #3
Transform
+
Damage
+
Velocity
组件只保存数据,没有任何逻辑。
五、逻辑应该放在 System
移动系统:
class MoveSystem {
update(world:World){
}
}
它会寻找:
Transform + Speed
的实体,例如:
entity.components.has("Transform")
entity.components.has("Speed")
找到以后:
transform.x += speed.value
这里注意,移动逻辑不属于 Player。而属于:
MoveSystem
于是:
Player
Enemy
NPC
子弹
只要有:
Transform + Speed
都能移动,完全复用。
六、攻击也属于 System
传统写法:
player.attack(enemy)
ECS:
CombatSystem
统一处理:
class CombatSystem {
update(world){
}
}
遍历:
AttackComponent
HPComponent
自动完成:
伤害计算
暴击
Buff
护盾
优势,新增机制时,不用修改:
Player
Enemy
Boss
只需要升级:
CombatSystem
即可。
七、AI 为什么也应该放进 System?
错误设计:
class Enemy {
ai() {
}
}
问题每个敌人都拥有一套 AI,浪费大量内存。正确:
class AISystem {
update(world){
}
}
寻找:
AIComponent
统一执行:
npc.think()
例如:
巡逻
追击
逃跑
攻击
都在:
AISystem
里面完成,优势:一万个怪物共享同一套逻辑,CPU Cache 命中率更高,性能提升非常明显。
八、动画系统也是独立的
错误:
player.playAnimation()
正确:
AnimationSystem
扫描:
AnimationComponent
更新:
Idle
Run
Attack
Dead
未来,甚至可以做到:
客户端动画
服务器动画
AI动画
统一处理。
九、为什么 ECS 性能更高?
传统 OOP,内存:
Player
hp
speed
animation
ai
Enemy
hp
speed
ai
NPC
speed
animation
数据分散,CPU Cache 不友好。而 ECS:
TransformArray
[x1,y1]
[x2,y2]
[x3,y3]
SpeedArray
10
15
20
MoveSystem,连续遍历:
TransformArray
SpeedArray
CPU Cache 命中率极高,这也是:
Unity DOTS
Unreal Mass
为什么能同时运行几十万 Entity。
十、HarmonyOS 为什么特别适合 ECS?
因为鸿蒙天然具有:
多设备
分布式
AI
低功耗
而 ECS 最大优势就是:
数据驱动
状态:
Transform
HP
Inventory
天然适合:
网络同步
设备同步
存档恢复
例如,手机:
World State
同步到:
HarmonyOS PC
只需要同步:
Component Data
无需同步逻辑,因为逻辑都在 System。这也是 ECS 非常适合:
分布式游戏
云游戏
AI Agent
的重要原因。
十一、未来 AI NPC 本质上也是 Component
例如:
class MemoryComponent {
}
class PersonalityComponent {
}
class GoalComponent {
}
AI System:
class AgentSystem {
}
执行:
Perception
↓
Memory
↓
Planning
↓
Action
于是 AI NPC 其实也是:
Entity
+
MemoryComponent
+
GoalComponent
+
PersonalityComponent
未来加入:
LLM
MCP
Agent
几乎不需要改动引擎,因为:
AI 本身就是一种 System。
十二、完整 ECS 架构
Entity
(只有 ID)
↓
Component
(只有数据)
↓
System
(全部逻辑)
↓
World
(统一管理)
↓
Engine
(驱动运行)
运行过程:
Input
↓
Component
↓
System Update
↓
World State
↓
Render
真正的思想只有一句:
Entity 不思考。
Component 不计算。
System 负责一切。
总结
很多开发者第一次接触 ECS 时,都会觉得:
为什么要把简单问题搞复杂?
但当项目规模达到:
几十个系统
几百种怪物
上万个 Entity
AI NPC
多端同步
你会发现,真正复杂的不是 ECS。
而是:
把所有逻辑塞进 Entity。
因为在大型游戏里:
Entity 会消失
Component 会变化
System 会不断增加
只有让:
数据属于 Component
逻辑属于 System
才能真正做到:
高性能
高扩展
低耦合
而这也是:
Unity DOTS、Unreal Mass、Bevy、Flecs 背后共同遵循的核心思想。
更多推荐



所有评论(0)