Unity-Dots
Dots前置
Dots简介
DOTS是什么
Data-Oriented Technology Stack(面向数据的技术栈)
- The C# job system
- The Burst compiler
- Unity Mathematics
- Unity Collections
- Entities ( Entity-Component System)
Entities.Graphics ( Hybird Renderer )
Netcode
Physics
Animation (WIP)
Audio(WIP)
DOTS可以应用到哪些地方?
具有大世界流式加载的游戏
具有复杂的大规模模拟的游戏
具有多种网络类型的多人联线游戏
具有需要客户端模拟预测的网络游戏,如射击游戏
为什么我们需要DOTS?
CPU与Memory的速度发展不均衡以及带宽限制
添加高速的缓存Cache内存层级结构去弥补
摩尔定律的延续与现代CPU设计。
越来越好的工艺
越来越多的核
分工越来越细的处理单元与存储
SIMD/SIMT
3.并行编程的发展
OpenMP
TBB—-Intel Threading Building Blocks
- CUDA—Compute Unified Divice Architecture
- OpencL-—Open Computing Language
- MPI/OpenMPI-—Message Passing Interface
OOD ==>DOD
面向数据设计(ODO)
程序设计方法
Instructional Programming 指令化编程
Functional Programming 函数化编程
Procedural Programming 过程化编程
Object-Oriented Programming/Design面向对象编程/设计(OOP/OOD) •Data-Oriented Design(DoD) 面向数据设计
OOD==>DOD
面向对象设计>面向数据设计
DOD本质:面向内存/缓存友好的设计
Cache的3C与3R
Compulsory misses:首次读取数据时,不可避免的Miss
Capacity misses:缓存空间不足时,连续使用期问访问数据过多的话,无法保存所有活动的数据
Conflict misses:发生访问冲突时,由于数据映射到相同的缓存行,导致缓存的抖动
Rearrange 重新排列(代码、数据):更改布局以增加数据空间的局部性
- Reduce 减少(大小、缓存行读取):更小更智能的格式、压缩
- Reuse重用 (Cache lines):增加数据的时间(和空间)的局部性
面向数据设计需要思考的问题
- 哪些数据需要捆鄉在一起,是一个概念还是有隐藏的含义?
- 你的数据布局是由如何设计的,AOS/SOA?支持SIMD?
- 你的目标平台内存最小访问单位是多少,CPU各级缓存有多大?
- 你的数据多久需要一次,一帧一次,还是一帧多次,还是几乎不更新?
- 你如何访问数据,随机\连续的还是stride或其他burst方式?
- 你是总在修改数据,还是只是读取数据,你正在修改所有的内容,还是只修改一部分?
- 哪些数据设计对带宽与延迟影响大?
DOTS面向数据设计原则
先设计,后编码
为高效使用内存与缓存而设计
为Blittable Data设计
为普通情况设计
拥抱迭代
Dots中的ECS架构
Entity-Component-System 实体组件系统
实体组件系统( ECS )架构
遵循组合优于继承的原则
面向数据设计
弱耦合
常被应用在游戏开发上
DOTS1.0中的ECS
ECS架构一直在演变
应用场景不同,各家实现和工作流有差异
DOTS1.0中的ECS与老版本变化较大,不要看老资料 •开放心态去接受
DOTS下的ECS
Entity:Entity不是一个容器,它只是一个标识符,它用来指示某个对象的存在。系统可以用它来操作,可以通过组件来分配某些属性
Component:组件是一个数据容器,没有任何逻辑,一组特定的参数关联在一起并定义属性。
System:系统是负责对数据进行操作的部分。换句话说,系统是对具有特定属性(组件)的特定实体执行的操作。