Lazy loaded image
Unity中DOTS架构与核心
Words 1061Read Time 3 min
2025-7-26
2025-7-26
type
status
date
slug
summary
tags
category
icon
password
comment

Unity DOTS

Unity 的 DOTS(Data-Oriented Technology Stack)是一套针对高性能大规模实体设计的技术体系,主要包括 实体组件系统(ECS)C# 作业系统(Job System)和Burst 编译器。它们协同工作,以数据为中心来组织游戏逻辑,大幅提升并行度和缓存利用率,从而在处理大量实体时获得显著性能优势。ECS 将游戏中的每个实体看作一个数据 ID,所有数据都存储在组件(Component)中,行为由系统(System)驱动,系统按需筛选包含指定组件的数据流进行处理。例如,一个移动系统可以查询所有具有“位置”和“速度”组件的实体,并并行更新它们的位置。

实体组件系统(ECS)

实体 (Entity)、组件 (Component)、系统 (System):在 DOTS 中,实体仅是一个唯一标识符,不包含逻辑或状态;组件是纯数据结构(如位置、速度、生命值等),可以添加在实体上;系统负责处理查询到的组件数据,并更新它们的状态。这种分离数据和逻辑的架构使得系统只关心需要的数据,其他无关组件不会影响处理,从而提高了效率和可维护性。例如,某系统只关心“位置”和“旋转”组件,那么具有其它组件(如渲染组件)的实体就不会被该系统处理。
notion image
数据布局与内存管理:ECS 将具有相同组件组合(Archetype)的实体存储在连续的内存块(Chunk)中,通常每块约 16KB。一个 Archetype 对应多个 Chunk,每个 Chunk 中的所有实体有相同类型的组件并在内存上紧凑排列,这大幅提高了 CPU 缓存命中率和数据遍历效率。当实体新增或移除组件时,数据会搬移到对应的 Chunk。相比之下,传统GameObject/Component 分散在堆上,内存开销大且不连续。DOTS 常用 NativeArray 等无托管容器来存储数据,以避免垃圾回收(GC)带来的开销。
notion image

C# 作业系统(Job System)

Unity 的作业系统允许将系统逻辑编写为并行任务,自动管理线程间同步和数据依赖。在 ECS 中,开发者可使用 SystemBase 提供的 Entities.ForEach 或 IJobChunk.ScheduleParallel() 等接口将数据处理封装为多线程作业。Unity 在调度时会跟踪哪些作业读写哪些组件,自动建立依赖关系,只在有冲突时串行执行,否则并行运行。例如,下面的示例系统在 OnUpdate 中调度了一个并行作业,批量更新所有实体的位置
这种模式使得数万条实体数据可以并行更新,充分利用多核CPU。
notion image

Burst 编译器

Burst 编译器:Burst 是一个将 C# IL 代码编译为高性能本机代码的工具链,基于 LLVM 技术。它能将 Job System 中的数据处理代码编译成针对目标平台优化后的 SIMD 指令,进一步提升执行效率。Burst 强调线程安全,自动处理不安全代码和内存对齐,因此使用它编译的作业可以在并行执行时保持稳定性并获得极致性能。
notion image
单线程,多线程,多线程+Burst对比
notion image

其他说明

在DOTS系统中以上是主要部分,还有一些为DOTS设计的
  • Unity Physics
  • Collections
  • Mathematics
  • Eneities Graphics
  • Netcode Entities
对于上述的三个组成DOTS的系统,任何一个系统都可以拿出来单独进行使用
DOTS只是一个工具,他仍然可以和GameObject一起使用,具体问题具体分析
 
上一篇
Unity Dots 实战
下一篇
Code Monkey Unity多人游戏

Comments
Loading...