ECS(Entity Component System)介绍(前导)
- ECS本质是一种编程架构模式,非unity特有。Unity通过Entities包实现ECS架构来组织代码和数据
- Entity是一个独立的ID,是多个独立components的组合。有点类似于拼积木,components就是小积木,不同小积木拼成了A、B、C三种模型,A、B、C就是三个不同entities,见下图。其中模型A和B的形状相同但是颜色不同(用的小积木的形状相同但颜色不同,对应ECS就是拥有相同的components,但是components中的值不一样)。A和B形状相同叫积木小甲,C叫积木小乙,小甲就是entityA和entityB所在archetype,小乙就是entityC所在的archetype。假设某一天,需要在A身上加一个组件形成一个新的积木,这个新的积木形状就叫小D,之前的A就不存在了,会被移入到小D对应的archetype中。这个变化过程叫做structural change,是一个非常耗时的操作
- Component保存数据,不同的数据结构的定义了不同的components。可以通过System来读取和修改components中的数据。在积木拼搭例子中,不同component的定义就是不同形状的小积木,而同一个component定义但是实例的值不同,可以理解为形状相同但是颜色不同的components
- System提供修改components数据的逻辑,也可以用来生成和创建Entity。在积木拼搭的例子中,其就像拼搭积极的流水线。其中拼搭小甲的是一条流水线,拼搭小乙的是一条流水线,分别对应了不同的两个systems。同一条流水线,又可以修改某个component积木的颜色,来生产出形状相同而颜色不同的积木,也就是不同的Entity。这里只是举例方便理解,实际代码中,system和entity并不是一一对应的
- 下图是Unity官方文档对entities、component、systems如何一起工作的示例:

DOTS(数据导向技术栈)介绍
- DOTS本质是Unity提出的一套性能优化技术集合,包含多个子系统:
- ECS架构(核心部分)
- Burst编译器:将C#代码编译为高度优化的原生代码
- Job System:安全的多线程任务管理系统
- Mathematics库:SIMD优化的数学库
- Hybrid Renderer:ECS与渲染管线的桥梁
- 设计目标:解决传统面向对象模式在性能密集型场景(如大规模实体、AI、物理等)的性能瓶颈
关系与层级
- 包含关系:
ECS是DOTS的核心架构,但不是DOTS的全部。DOTS是一个更广泛的技术栈,ECS是实现其高性能目标的核心编程范式 - 协同工作:
ECS负责数据组织,Job System和Burst编译器负责多线程与代码优化,Mathematics库提供数学运算支持,共同构成DOTS的性能优化生态
关键区别

性能对比(传统OOP vs ECS/DOTS)

何时使用?
- 推荐ECS/DOTS的场景:
- 大规模实体(如RTS游戏单位、粒子系统)
- 需要复杂物理模拟(如流体、布料)
- 高性能计算需求(如体素地形生成)
- 传统模式更合适的场景:
- 小型项目或原型开发
- 需要快速迭代的UI逻辑
- 依赖大量第三方插件(如复杂动画状态机)
代码示例对比
传统MonoBehaviour方式
public class Enemy : MonoBehaviour
{
public float speed = 5f;
void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
#ECS + DOTS方式
// Component(纯数据)
public struct MoveSpeed : IComponentData {
public float Value;
}
// System(逻辑处理)
public partial struct MovementSystem : ISystem
{
public void OnUpdate(ref SystemState state)
{
float deltaTime = SystemAPI.Time.DeltaTime;
foreach (var (transform, speed) in SystemAPI.Query<RefRW<LocalTransform>, RefRO<MoveSpeed>>()) {
transform.ValueRW.Position += transform.ValueRO.Forward() * speed.ValueRO.Value * deltaTime;
}
}
}
总结
- ECS是架构,DOTS是包含ECS的技术生态
- ECS+DOTS组合通过数据连续性、多线程和编译优化,突破传统OOP的性能限制,尤其适合高性能需求场景
- Unity通过Hybrid模式允许ECS与传统GameObject共存,实现渐进式迁移
参考