Unity DOTS学习记录(一)-ECS架构
Unity DOTS 简介
Unity 的 DOTS(Data-Oriented Technology Stack,面向数据的技术栈)
是一套基于 ECS 架构 构建的 高性能开发框架,主要用于解决 海量对象、高并发计算 场景下的性能问题,例如大量单位移动、战斗、AI 计算等。
ECS 架构说明
ECS 是 Entity(实体)– Component(组件)– System(系统) 的缩写,其核心思想是 数据与行为分离。
1. Entity(实体)
实体用于表示一个具体的“单位”,例如:
- 一个敌人
- 一颗子弹
- 一个建筑
实体的本质只是一个 ID(标识符),本身不包含任何数据或逻辑。
2. Component(组件)
组件是 挂载在实体上的纯数据,用于描述实体的属性状态,例如:
- 移动速度
- 攻击冷却时间
- 伤害数值
- 生命值
在 DOTS 中:
- 组件使用 struct(结构体)
- 不包含行为逻辑
- 不产生 GC
3. System(系统)
系统用于 批量处理具有特定组件组合的实体,是真正编写逻辑的地方,例如:
- 移动系统
- 攻击系统
- AI 系统
系统会遍历满足条件的实体集合,并对其数据进行统一处理。
DOTS 高性能的原因:
传统方式(GameObject + MonoBehaviour)
传统 Unity 开发中:
- 以 GameObject 作为载体
- 将多个 Component(类对象) 挂载其上
- 每个对象通常有自己的 Update() 调用
这种方式的优点是:
- 面向对象
- 易理解
- 开发效率高
但缺点也非常明显:
- 对象数量多,内存分散
- Cache 命中率低
- GC 不可控
- 基本运行在主线程
在大量单位场景下,性能瓶颈明显。
DOTS 方式(数据导向)
在 DOTS 中:
- Entity 和 Component 都是纯数据
- Component 使用结构体,内存连续,不产生 GC
- System 统一批量处理数据,而不是逐对象调用逻辑
同时,DOTS 还结合了多项底层优化技术:
- 高效的 Entity 查询机制
- Unity.Mathematics 数学库(SIMD 友好)
- Burst Compiler 将 C# 代码编译为高度优化的本地机器码
- Job System 支持多线程并行执行,大幅提升 CPU 利用率