DOTS 是什么
Data-Oriented Technology Stack (面向数据的技术栈)
有五个核心包
- The C# job system (快速,安全,使用简单地编写多线程代码)
- The burst smopiler (优化 c# 代码的编译器, 可以编译生成比 Mono,IL to Cpp 更快的代码 )
- Unity Mathematics(在 job system 中使用的数学库)
- Unity Collections(提供了常见的集合类型,如列表,哈希映射表等)
- Entities (Entity-Component System)(ecs 是 gameobject 更高效更轻量的替代品)
额外包:
- Entities. Graphics (Hybird Renderer) (是一套支持 URP 与 HDRP 的 entity 渲染解决方案,为了优化 cpu 的性能设计)
- Netcode (建立在五个核心包之上的网络解决方案,提供网络多人连线的服务器功能与客户端预测等功能)
- Physics(建立在五个核心包之上的物理解决方案,)
- Animation (WIP)
- Auido (WIP)
面向数据设计
OPP 易于理解,但不高效
OOD->DOD
面向对象设计->面向数据设计
DOD 本质:面向内存/缓存友好的设计
DOTS 面向数据设计原则
- 先设计。后编码
- 为高效使用内存和缓存设计
- 为 Blittable Data 设计
- 为普通情况设计
- 拥抱迭代
L1, L2, L3 缓存的树形结构设计
ECS 架构
Entity-Componment-System (实体组件系统架构)
- 遵循组合由于继承的原则
- 面向数据设计
- 弱耦合
- 常用于游戏开发
游戏引擎架构演变
基于对象继承的架构
基于 Actor-component 对象组合架构
基于 ECS 的面向数据的设计架构
ECS 架构本质是组合数据数组而非对象数组,Entity 并非对象,也不是容器,而是对象索引的 ID 或标识符。Component 才是容器,但不是对象容器,而仅仅是一个数据容器,不包含任何逻辑。System 才是真正负责对数据操作的部分,System 才是对特定组件特定实体执行的操作。
DOTS 下关于 ECS 的专有名词
Archetypes: 依然不是对象,是一个标识符,表示所有具有相同 component 组合的实体类型。
World,EntityManager
World 是一系列 Entity 的组合,每一个 Entity 在一个 world 中是唯一的。统一受到 world 中 EntityManager 结构的管理。Entity 负责创建,销毁,修改 Entity 中的实体。
Structural Change
在 Query 查询时,会通过 Query 切片的方式来组织查询。凭感觉上是连续的,但不会造成内存上的移动。
DOTS 面向数据的设计部分,就是在设计队列的结构,ecs 就是组织队列的规则,job system 就是做队列的调度。
缓存分层的原因本质是物理距离决定的。
安装相关包
- 添加: com. unity. entities
安装完成后,编译器会多 Entities 和 Jobs 的标签。
Entities 相关的菜单
Blittable Types: 在托管代码和非托管代码的内存中具有相同的表现形式。
Job 的调度方式有三种:
Run->主线程立即顺序执行
Schedule->单个工作线程或主线程,每个 Job 顺序执行
ScheduleParallel->在多个工作线程上同时执行,性能最好,但多个线程访问同一个数据时可能会发生冲突。
设计与组织数据是涉及 Archetype 与 component data
修改与更新数据是控制数据读写,访问权限与访问频率。
### Data-Oriented Design
- Optimized for how computers store and process data.
- Separate data form transformations
- Like data stored contiguously
- Maximize cache hits
- Add/Remove components to add/remove functionally.
ECS -Entities
- Just an Index and Version number for ID
- Group data compontents associated with one “Thing”
- Each unique combination of componetns is called an Archetype.
Compontent
- Actual data associated with an Entity.
- Static or dynamatic data
- Stored in chunks (16kb blocks of memory allocated in RAM)
- Only data of the same archetype is stored in the trunk.
System
- Data transformation
- Ran acorss groups of entities.
- Get groups of entities through Eneity Query.
- Consider update order and job dependencies.
System (Player Loop)
- Each frame has the following sections:
- Initialization Group
- Simulation Group
- Presentation Group
Job System
- Multithreading in Unity
- Jobs are scheduled on the main thread.
- Worker threads execute jobs from the job queue when available.
- Some built in dependency mangement.
Burst Compiler
- Massive effciency gains through compile time optimizations.
- SIMD-Single Instruction, Multiple Data.
- Only works with blittable, unmanaged data types.
Other Packages - Unity. Mathematics-Burst optimized math structures and opeartions.
- Unity. Collections-Burst compatible collections in native memory.
- Unity. Graphics-Render entities in your game.
任何游戏对象放入 SubScene 后都会被转化为实体。