目录
- 前言
- DOTS是什么?
- 谁需要关注DOTS?
- DOTS可以应用到哪些地方?
- 为什么需要DOTS
前言
本文是Metaverse大衍神君的《DOTS之路》系列课程的学习笔记
DOTS是什么?
Data-Oriented Technology Stack(面向数据的技术栈)
从字面意义上来说DOTS是面向数据的技术栈
实际上Dots是由Unity的五个核心Package组成
它定义了一种全新的Unity代码编写模型
并在这些核心包之外提供了额外的游戏功能相关的Package和工具
是Unity下面向数据设计与编程的一整套解决方案
核心Package
- The C# Job System:
- The Brust Compiler
- 优化C#代码的编译器
- 可以编译生成比通过Mono或IL2CPP更快的代码
- 并不止为DOTS而存在,同样可以编译Unity中的任何代码
- Unity Mathematic
- 一套可以在Job System中使用的数学库
- 在Brust编译的代码中是经过特别优化的
- Unity Collections
- 提供常见的集合类型(列表、哈希映射表等)
- 内存分配属于非C#托管类型
- 可以在Brust编译代码中的Job System中使用
- 这些基类类型支持安全检查,有助于他们在Job System中安全使用
- Entities(Entity-Component System)
- Entity对象是比GameObject更轻量、更高效的替代品
- Entity并不承担任何代码
- Conpoment只是片段数据集合
- Entity和Componment都由System对应的代码单元处理
游戏功能相关Package
- Entities.Graphics(1.0版本之前的Hybird Renderer)
- 支持URP和HDRP的Entity渲染解决方案
- 并不是为了优化GPU而是优化CPU上的性能而设计的
- Netcode
- 建立在五个核心包上的DOTS网络解决方案
- 提供网络多人服务器功能、客户端预测等相关功能
- Physics
- 建立在五个核心包上的DOTS物理解决方案
- 支持两个后端
- Unity Physics(默认)
- Havok Physics
- Animation(开发中)
- Audio(开发中)
谁需要关注DOTS?
- 技术负责人
- 在技术选型与Unity项目中是否使用DOTS的重要决策人
- 处理游戏逻辑部分的开发人员
- 需要非常了解DOTS的代码编写与设计方式
- 了解Brust编译的细节
- 处理网络通信部分的开发人员
- 需要非常了解DOTS的代码编写与设计方式
- 了解Brust编译的细节
- 处理动画部分的开发人员
- 处理物理模拟部分的开发人员
- 开发工具与工作流相关内容的开发人员
- 技术美术
- DOTS相关工具与插件的开发人员
DOTS可以应用到哪些地方?
多线程加载、通讯,以及充分利用多核并行计算的游戏类型
- 具有大世界流式加载的游戏
- 具有复杂的大规模模拟的游戏
- 具有多种网络类型的多人联机游戏
- 具有需要客户端模拟预测的网络游戏,如FPS
总之,只要是CPU Bound类的游戏都可以考虑用DOTS做并行优化
为什么需要DOTS
- CPU、GPU、Memory以及带宽的发展速度的不均衡
- 添加高速缓存结构Cache内存层级结构去弥补(L1、L2、L3级的CPU缓存)
- 面向数据编程本身是对缓存友好的,可以极大程度增加缓存Cache的命中,提高效率
- 摩尔定律 的延续与现代CPU设计主要依靠的是
- 越来越好的工艺
- 越来越多的核
- 分工越来越细的处理单元与存储
- SIMD/SIMT
- 并行编程的发展,要么依赖特地的硬件,要么是针对科学计算设计的,几乎无法集成到Unity中
- OpenMP
- TBB(Intel Threading Building Blocks)
- CUDA(Compute Unified Device Architecture)
- OpenCL(Open Computing Language)
- MPI/OpenMPI(Message Passing Interface)