图解ECS
图解ECS
一、ECS 基本概念图
ECS 是数据驱动的架构,分为 实体(Entity)、组件(Component) 和 系统(System),是一个高效的并行编程模型,特别适用于大规模对象场景。
flowchart TB
A[实体 Entity] -->|包含| B[组件 Component]
A -->|通过| C[系统 System]
B -->|存储数据| D[LocalTransform]
B -->|存储数据| E[Health]
C -->|执行逻辑| F[PlayerMovementSystem]
C -->|执行逻辑| G[EnemyAISystem]
C -->|执行逻辑| H[BulletCollisionSystem]
说明:
- Entity(实体):游戏中的对象,实际上就是一个 ID。它不包含数据或行为,只是一个空的“容器”。
- Component(组件):为实体存储数据,每个组件专注于存储某一类数据(例如
Health、Position)。 - System(系统):包含处理数据的逻辑。系统从 ECS 世界 中提取符合条件的实体(比如所有拥有
Position和Velocity组件的实体),然后对这些实体的数据进行操作。
二、ECS 系统的执行流程图
在 Unity 中,ECS 通过查询(Query)来获取数据并进行处理。通常,System 是按照更新顺序来运行的。下面是ECS 执行过程的简化图示:
sequenceDiagram
participant Start as 游戏启动
participant System as ECS 系统
participant Query as 查询
participant Component as 组件数据
participant Transform as 位置更新
Start->>System: 游戏开始,加载 ECS 系统
System->>Query: 查询拥有 Position 和 Velocity 的实体
Query->>Component: 获取组件数据
Component->>Transform: 更新位置、速度等
Transform->>System: 执行 PlayerMovementSystem
Query->>Component: 获取敌人 AI 数据
Component->>System: 执行 EnemyAISystem
说明:
- 在每一帧中,系统会查询符合条件的组件(例如:所有有
Position和Velocity的实体)。 - 然后,系统会处理这些组件的数据,例如:
PlayerMovementSystem更新玩家位置,EnemyAISystem更新敌人 AI。 - 每个系统都在 单独的线程 上并行执行,极大提高了性能。
三、ECS 系统的生命周期图
graph TB
A[游戏启动] --> B[初始化实体]
B --> C[添加组件到实体]
C --> D[运行系统 -每帧]
D --> E[系统更新组件数据]
E --> F[系统查询实体并操作]
F --> G[销毁实体]
G --> D[系统持续更新]
说明:
- 实体的生命周期:通常在游戏开始时创建,运行时系统对它们的组件进行更新。实体生命周期结束时(例如,游戏结束或对象销毁),实体将被销毁。
- 系统的生命周期:每帧,系统会进行 查询、处理、更新 数据,并通过 组件 更新实体的状态。
- 组件的生命周期:组件的生命周期与实体生命周期相关,实体销毁时,所有附加的组件也会被销毁。
四、ECS 的并行执行和性能优化图
ECS 特别适合并行计算,下面是一个展示 ECS 并行执行 优势的图表:
graph LR
A[多个独立系统] --> B[并行执行]
B --> C[高效利用多核 CPU]
C --> D[减少锁与竞争条件]
D --> E[快速处理海量实体数据]
说明:
- ECS 的最大优势之一就是并行执行。每个系统可以在不同的 CPU 核心上并行执行,ECS 能高效地将任务分配到多个线程。
- 系统之间不会有数据竞争,因为它们处理的数据是分离的(每个系统处理不同的组件或实体)。
- 组件数据是线性的内存布局,这让缓存局部性更好,减少了 CPU 缓存未命中的情况。
五、ECS 内存布局(内存布局优化)
graph TD
A[ECS 内存布局] --> B[每种组件存一块内存]
B --> C[数据紧密存储]
C --> D[避免缓存未命中]
D --> E[提高性能 减少GC]
说明:
- 内存布局优化:ECS 通过把相同类型的数据存储在一起(例如:所有的
Position数据存储在一块内存中)来最大化 CPU 的 缓存命中率。 - 减少内存碎片:这种布局有助于减少内存碎片,并且在进行数据操作时,CPU 可以更快地处理这些数据。
- 性能提升:通过优化内存布局和减少垃圾回收(GC),ECS 提供了更高的 性能,特别适用于 大规模游戏场景。
六、ECS 系统间的数据交互和依赖关系图
graph LR
A[PlayerMoveSystem] --> B[TransformSystemGroup]
B --> C[PlayerShootSystem]
C --> D[BulletMoveSystem]
D --> E[BulletHitSystem]
E --> F[ScoreSystem]
说明:
- 每个系统都通过 查询组件数据 与其他系统共享数据。
- 数据依赖关系:系统之间有明确的依赖关系,例如:
PlayerMoveSystem会更新Transform,PlayerShootSystem会依赖于TransformSystemGroup的位置数据来发射子弹。 - 执行顺序:系统执行的顺序非常重要,确保
TransformSystemGroup先执行以更新LocalToWorld,然后PlayerShootSystem才能正确读取枪口位置进行发射。
总结
- Entity:实体仅是一个唯一标识符,承载组件。
- Component:组件仅存储数据,没有行为,系统负责处理组件。
- System:系统执行具体的逻辑,通常会查询符合条件的实体数据,并修改这些数据。
- 性能优势:ECS 通过优化内存布局、高效的数据并行计算、减少数据竞争和锁,能够显著提高游戏的性能。
🔥 推荐 Unity 插件
🌧️RainEffect-后处理雨水窗户
🎮 EasyRuntimeGizmo – 运行时可视化 Gizmo 工具
🧭 EasySceneMarker – 快速场景跳转标记系统
📈 Unity 最畅销插件榜单
⚛Unity TopDownded
点赞鼓励下,(づ ̄3 ̄)づ╭❤~
作者:世纪末的魔术师
出处:https://www.cnblogs.com/Firepad-magic/
Unity最受欢迎插件推荐:点击查看
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号