Unity官方Dots范例工程学习——DOTS简介和工程下载

  大家好,我是阿赵。
  接下来准备通过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 系统

这三者的关系是:

  1. 场景里面存在着的不再是一个个Object或者GameObject,而是一个个的实体
  2. 实体身上会挂载着不同的component组件,这些Component组件不会实际带有功能,而只是把数据存储着。
  3. 通过编写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编辑器安装好:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值