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 利用率