在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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 背后共同遵循的核心思想。

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐