图解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(组件):为实体存储数据,每个组件专注于存储某一类数据(例如 HealthPosition)。
  • System(系统):包含处理数据的逻辑。系统从 ECS 世界 中提取符合条件的实体(比如所有拥有 PositionVelocity 组件的实体),然后对这些实体的数据进行操作。

二、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

说明

  • 在每一帧中,系统会查询符合条件的组件(例如:所有有 PositionVelocity 的实体)。
  • 然后,系统会处理这些组件的数据,例如: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 会更新 TransformPlayerShootSystem 会依赖于 TransformSystemGroup 的位置数据来发射子弹。
  • 执行顺序:系统执行的顺序非常重要,确保 TransformSystemGroup 先执行以更新 LocalToWorld,然后 PlayerShootSystem 才能正确读取枪口位置进行发射。

总结

  1. Entity:实体仅是一个唯一标识符,承载组件。
  2. Component:组件仅存储数据,没有行为,系统负责处理组件。
  3. System:系统执行具体的逻辑,通常会查询符合条件的实体数据,并修改这些数据。
  4. 性能优势:ECS 通过优化内存布局、高效的数据并行计算、减少数据竞争和锁,能够显著提高游戏的性能。

🔥 推荐 Unity 插件
🌧️RainEffect-后处理雨水窗户
🎮 EasyRuntimeGizmo – 运行时可视化 Gizmo 工具
🧭 EasySceneMarker – 快速场景跳转标记系统
📈 Unity 最畅销插件榜单
Unity TopDownded

posted @ 2025-08-21 10:11  世纪末の魔术师  阅读(82)  评论(0)    收藏  举报