大家好,我是阿赵。
接下来准备通过Unity官方提供的DOTS例子工程,学习一下Unity的DOTS技术。
一、 DOTS是什么
在说明DOTS是什么之前,先说一下在没有DOTS之前,Unity是怎样运行的。
1、 MonoBehaviour
在Unity传统的编程方式里面,都是通过创建继承MonoBehaviour的类,然后把类挂载在GameObject上。然后脚本会自动执行MonoBehaviour的各种声明周期,比如Awake、Start、Update、Enabled等。
这里存在一个问题,MonoBehaviour本身继承了很多用不到的变量和函数




这里意味着,只要我们通过面向对象的方式,继承了MonoBehaviour之后,我们每创建一个对象出来,都是比较臃肿,有许多的数据和函数冗余。
2、 单线程API
使用过Unity引擎的朋友应该都知道,Unity的官方API方法,都只能在主线程里面使用。我们可以在C#开线程,处理诸如数据、网络等问题。但涉及到Unity本身提供的API,是不能在子线程里面执行的。
这样就导致了就算CPU能力很强,但Unity本身并不能使用全部的能力去计算。
3、 编译器问题
在不使用IL2CPP的时候,我们在Unity项目里面编写C#脚本,会通过Roslyn编译器编译成IL字节码,然后在运行的时候通过Mono虚拟机,转换成目标平台的机器码
而在使用了IL2CPP之后,c#脚本的代码先通过Roslyn编译器转换成IL字节码,然后IL2CPP编译器转换成C++代码,最后在通过特定平台的编译器,编译成特定平台的机器码,这样可以绕过了mono虚拟机,增加了安全性。
接下来看看DOTS为Unity解决了哪方面的问题。
DOTS(Data-Oriented-Technology-Stack),全称是数据导向型技术堆栈。有别与之前的面向对象的方式,DOTS是由数据导向的,所以可以理解为是面向数据。
DOTS主要提供了以下几点组成部分:
1、 ECS
ECS(Entity Component System)实体组件系统,它的组成部分就如字面,由3部分组成:
1. Entity 实体
2. Component 组件
3. System 系统
这三者的关系是:
- 场景里面存在着的不再是一个个Object或者GameObject,而是一个个的实体
- 实体身上会挂载着不同的component组件,这些Component组件不会实际带有功能,而只是把数据存储着。
- 通过编写System,对特定的组件进行逻辑处理
这样做的后果是,数据和行为分离了。实体只是组件的载体,会产生什么样的功能,不再从实体整体来决定,而是完全又挂载的组件数据来决定。
这里插一句个人的感受。这种编程的思路是比较绕的,如果是之前的面向对象,我们举个例子,我们定义一个角色,比如是person作为基类,然后给person增加各种的实现方法,比如看东西、说话、听声音、走路等。但到了ECS之后,不再有person这个基类和业务边界了,取而代之的是,我们会对每一个实体进行检查,假如实体带有眼睛的组件,那么我们会专门写一个系统给眼睛组件看东西,假如实体带有嘴巴,就写一个System实现说话的功能,针对的都是组件,没有人的整体。
这个编程的思路转变是比较大的,需要好好的适应一下。但带来的好处也很明显,由于没有了对象,没有了继承,所以没有了冗余的变量和函数,没有了额外的生命周期带来的消耗。而且由于存储实体和组件都是可以连续存储内存和访问的,所以访问的速度也就变快了。
2、 Job System
之前在MonoBehaviour下,Unity的API只能在单线程运行。所以Job System就是弥补这方面的。JobSystem可以使用多线程运行,充分的利用了CPU的性能。
3、 Burst Complier
Burst编译器封装了LLVM编译器,把IL字节码编译成优化后的机器码,它主要是为Job System和ECS服务的。
IL2CPP和Burst编译器是可以并行工作的。
这样分析之后,就可以发现,DOTS想达到的目的是,为了在大规模计算的项目里面,能更节省内存和CPU算力,并且提供多线程能力。其缺点是编写ECS的时候编程的思想对比起面向对象,是有那么一点反人类的。
所以我个人认为,在考虑是否要使用DOTS的时候,要看看自己本身项目的类型,是不是存在着性能的瓶颈。如果只是中小型的项目,我感觉使用面向对象会更直观明了,开发速度会更快。或者在大型项目里面,只针对有性能瓶颈的部分,比如多人同屏战斗、大范围单位对象控制这类逻辑进行DOTS改造。
二、 下载DOTS的package
打开Unity引擎,然后打开Package Manager,搜索entities:

最基础的Entities是必须要安装的,然后Entites Graphics最好也安装一下。
这里需要注意的是,由于DOTS是一个比较新的功能,所以在不同的版本它的功能完整性是不一样的,使用的API也是不一样的。
比如在Unity2019版本里面:

Entities只是一个preview版本。
而Unity2022和Unity6里面的Entities的版本是一致的,都是最新的:

三、 下载官方的DOTS范例工程
通过网址:
https://unity.com/cn/dots
可以打开Unity官方DOTS的页面:

在页面下面有针对DOTS的几个组成部分做介绍,比如ECS和Burst编译器



还有一些DOTS应用的商业例子:

而我们需要下载的工程在最下面,开始使用DOTS,点击了解详情:

它会打开GitHub:
https://github.com/Unity-Technologies/EntityComponentSystemSamples

通过地址克隆检出项目:
https://github.com/Unity-Technologies/EntityComponentSystemSamples.git
会看到里面有多个Demo项目:

这些项目是使用Unity6制作的,可以提前先把对应版本的Unity编辑器安装好:

2769

被折叠的 条评论
为什么被折叠?



