​ ECS 是一种面向数据的架构模式,全称为 Entity-Component-System(实体-组件-系统),广泛应用于现代游戏引擎(如 Unity DOTS)中。相比传统的面向对象编程(OOP),ECS 强调将数据与逻辑解耦,以实现更高的性能和更好的扩展性,特别适用于处理大量对象和并行任务的场景。

​ 它的核心理念是:“组合优于继承”,即用多个组件组合出复杂行为,而不是通过类继承链扩展功能。

ECS的核心

ECS 由三个核心部分构成:

1. Entity(实体)

实体是游戏世界中存在的“对象”,如一个角色、一颗子弹、一个灯光等。它本身没有数据,也没有行为,只是一个唯一的标识符(ID)。
举例:

  • Entity 001:一个敌人角色
  • Entity 002:一枚飞行中的子弹

实体通常通过添加不同的组件来“获得”属性和行为。

2. Component(组件)

组件是纯数据结构,用于描述实体的某个方面。每个组件只包含数据,不包含行为逻辑。例如:

1
2
3
4
5
public struct Position : IComponentData
{
public float x;
public float y;
}

上面的 Position 组件只负责表示实体在空间中的位置;要改变位置,需要由系统处理。

常见的组件还包括:

  • Velocity(速度)
  • Health(生命值)
  • Renderable(可渲染)

3. System(系统)

系统是行为逻辑的执行者,它定义了对某组组件进行操作的算法。系统会遍历所有拥有特定组件组合的实体,对其进行处理。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
public partial class MovementSystem : SystemBase
{
protected override void OnUpdate()
{
float dt = Time.DeltaTime;
Entities.ForEach((ref Position pos, in Velocity vel) =>
{
pos.x += vel.x * dt;
pos.y += vel.y * dt;
}).Schedule();
}
}

这个 MovementSystem 会在每一帧中更新所有带有 Position 和 Velocity 的实体,实现移动逻辑。

ECS 的优势

特性 传统 OOP ECS
扩展方式 继承 组合
性能表现 差(频繁GC,缓存命中率低) 优(内存连续,易于并行)
并行能力 低 高
耦合程度 高 低