Unity DOTS框架学习系列一


前言

本文主要介绍Unity的多线程式数据导向型技术堆栈(DOTS)。将阐述Unity过渡到面向数据的设计方法的动机、与DOTS相关的关键术语和概念,并借助相关用例,对使用DOTS的优势和风险提供一些简明扼要的指导。
在这里插入图片描述


一、介绍

DOTS标志着Unity架构发生了根本改变。DOTS是Unity采用的若干全新技术的组合,需要Unity采用新的工作方法并以面向数据的设计(DoD)理念来重新思考代码和数据。这与Unity不使用DOTS时面向对象的设计方法截然不同。

DOTS可以利用多核处理器来实现数据的并行处理并提高Unity项目的性能。

目前,DOTS可与不同的格式共存,并与Unity MonoBehaviours(非DOTS结构)一起使用。最终,Unity将完全过渡到DOTS。尽管我们承诺仍为尚未过渡到DOTS的Unity用户提供支持,但同时也强调了熟悉DOTS并开始考虑使用DOTS的长远影响的重要意义。

DOTS是一种新产品,现在尚在起步阶段。由于它处于持续发展中,随着我们努力使其达到最佳状态,您将看到API会不断演变和日趋成熟。

就目前而言,您可以将DOTS视为Unity引擎的一种扩展。DOTS仍处于预览版状态,您可以在自己的项目中开始探索和使用。您可以使用DOTS(必要时还包括MonoBehaviors)从头开始创建新项目,也可以将现有项目的元素转换为DOTS。

如果您将DOTS确定为自己的重点关注领域,建议您尽快开始学习DOTS。尽管DOTS API的元素会发生改变,但DoD的基本原理以及使用DOTS来处理项目的方法却是不变的。

二、什么是DOTS

Unity的多线程式数据导向型技术堆栈(DOTS)是若干技术的融合。这些技术相互配合,共同为Unity提供面向数据的编码方法。这样就可以构建更适合目标硬件、性能也更高的项目。

DOTS包含以下元素:

  • 实体组件系统(ECS) - 提供使用面向数据的方法进行编码的框架。它通过Entities软件包进行分发,您可以通过Package Manager来添加编辑器。
  • C#作业系统 - 提供一种生成多线程代码的简单方法。它通过Jobs软件包进行分发。
  • Burst编译器 - 可生成快速、优化的本机代码。它通过Burst软件包进行分发,可通过Package Manager在编辑器中使用。
  • 本机容器 - 属于ECS数据结构,可提供对内存的控制。

元素1-3通常被称为DOTS的三个支柱,可作为单独的Unity软件包使用。它们共同构成了交付面向数据的高性能解决方案的基础。
在这里插入图片描述

使用DOTS的通用网关通过实体组件系统(ECS)来实现。ECS是一种结构化和编写代码的方法,它可以让您从数据中分离信息(例如行为)。这样就能够按照逻辑方式排列数据,从而减少CPU缓存丢失的数量,继而提高从内存访问数据的速度。很多情况下,这样可以显著提升性能,而在非DOTS结构下却是做不到的。

ECS为您提供了一种轻松定义如何在内存中组织数据以及如何让CPU访问数据的途径。这与不使用DOTS时的Unity结构大相径庭。通过使用线性数据以及处理数据集而非单个MonoBehavior脚本的系统,我们可以为将来奠定一个更具扩展性的基础。换句话说,借助ECS,我们正在从面向对象的行为方式转变为面向数据的设计。

有关ECS的介绍,请参阅我们的教程“实体组件系统”以及我们的博客文章“关于DOTS实体组件系统”。

此外,我们还创建了一个DOTS的轻量级版本,专门针对具有较多硬件限制的设备(例如移动设备)。Project Tiny是一个独立的Unity软件包,它能以编辑器的形式提供DOTS模式,供您创建小型轻便的游戏和应用程序。

三、为什么说DOTS非常重要?

DOTS使内容创建者可以打造各种标志性体验(或宏大或简约),从而拓展我们对实时娱乐和模拟中各种可能场景的理解。

对于Unity而言,我们希望能确保自己为下一波实时创新发展浪潮提供鼎力支持。Unity引擎需要做好充分准备,以最大程度发挥未来硬件的优势,从而让您始终走在创新技术的前沿。

技术发展日新月异。历史表明,现今的高保真AAA游戏和沉浸式3D体验会在不久的将来成为明日黄花。在这种情况下,我们需要确保Unity引擎能为支持下一代实时3D开发做好准备。CPU和内存性能并未随着应用程序需求的增长而得到提高,因此那种能充分利用硬件特性和相应约束的软件架构便为满足这些需求提供了可行的解决方案,而这正是Unity和DOTS力所能及的。
在这里插入图片描述

DOTS如何提高性能?

Unity引擎针对一系列硬件目标而构建,但所有硬件以及我们可以涉及的领域都存在一些共通的问题。简单来说,这些问题包括:

  • CPU的处理速度正在相对放缓。我们在过去20年中所看到的增长率已不太可能重现。

  • 对于许多硬件系统而言,内存访问速度并未随着处理速度的提高而提高。Unity需要以极高的速度访问内存。对于那些具有快速内存访问速度的平台,您需要一种排列和访问内存数据的方法,从而可以有效地利用这种速度。

  • GPU可通过并行处理来提供改进性能的解决方案,但由于没有专用的工具对这方面加以利用,因此它们属于相对未开发的资源。

软件是消除此类硬件约束以提高性能的关键。实际上,它的作用相当于减少功耗和延长电池使用寿命。
为了解决这些问题:

  • 实体组件系统(ECS)提供了一种面向数据的编码设计方法。利用面向数据的方法,可以对数据结构加以组织,以免出现高速缓存未命中的情况,从而令随后的数据访问更加高效、快捷。由于面向对象的设计并不专注于数据的组织,因此高速缓存未命中的情况很常见,这样就减慢了CPU访问数据的速度,因为它必须频繁地返回访问主内存中的数据。
  • C#作业系统可以轻松地用C#编写快速、并行化的代码,以充分利用当今的多核处理器。
  • Burst编译器会生成高度优化的代码,而这些代码可以利用您要编译的平台硬件。

四、什么是面向数据的设计?它与面向对象的设计有何不同?

面向数据的设计将编码的重点放在了通过优先排列和组织数据以尽可能提高其内存访问效率来解决问题上。这与面向对象的原理截然不同,后者强调代码的设计应由您所创建的事物模型来主导。

在DOTS之前,面向对象的编程模型是Unity工作的全部。

典型的面向对象的工作流程是:

  1. 创建游戏对象
  2. 为其添加组件
  3. 编写用于更改这些组件属性的MonoBehaviour脚本

在运行时,游戏对象依赖于对组件的引用。当MonoBehaviour脚本查找组件数据时,由于它们分散在内存中,因此需要花费一些时间才能找到。

采用面向对象的方法时,代码的结构通常基于以下几点:事物的构造(对象,构建为“类”)、事物的构成(数据对象内容)、事物行为内容的定义,以及它们如何与其他事物进行交互。这几乎是我们在现实世界中创造事物的自然延伸。但是,就结构化对象所含的信息而言,该方法在底层数据上增加了一个抽象层,这可能会扭曲数据的组织方式并减慢其访问速度。例如,如果您希望函数对某个对象内的另一段数据进行操作,那么该函数就需要从父类进行继承或者需要重写。

在面向数据的设计中,您需要将所有内容都视为数据,而不是对象。这样做有助于确保所有数据都易于访问,并且在使用时可以不受层级类的限制。

对于面向数据的方法,典型的工作流程是先确定然后组织支持您要实现的最常见任务的数据。最常见的问题就是在运行时最需要解决的问题,因此在开发中优先考虑这些问题正是关键所在。围绕数据来组织代码以及数据的流动,意味着在运行时对其访问要比通过多个类来获取数据更加有效。

在这里插入图片描述

五、DOTS适合我/我的团队/我的项目吗?

除非您在寻求短期或中期的性能改进,否则很难判定是否需要过渡到DOTS或何时过渡到DOTS。

DOTS几乎可以为每个应用程序带来一定程度的性能改进。这其中包括性能、电池使用寿命、迭代及项目可扩展性。过渡到DOTS不会造成任何性能的下降,但评估过渡到DOTS所增加的费用却至关重要,尤其是对于那些仅带来较小改进的项目。

对于所有应用程序而言,DOTS适合处理大量数据,例如开放式环境或使用大量相同材料的复杂结构。通过在实例之间共享公共数据以减少内存访问,DOTS也同样适用于重复的元素。

DOTS将来会帮助您开发高质量的内容,而不使用DOTS的Unity却很难做到,这一点务必要考虑清楚。例如,当今的标准游戏和Unity项目已经取代了过去的AAA游戏。放眼未来,您需要采用DOTS来保持竞争力。

针对不同的垂直行业,DOTS可以适用于不同的解决方案:

对于AEC应用:

  1. DOTS适合处理大型数据集并确保内容的可扩展性。

  2. DOTS非常适合进行大型交互式地图和具有大量模型和重复内容(例如建筑物和道路)的环境设计。

  3. DOTS适用于复杂的工程可视化,可大规模地模拟现实环境。例如,DOTS非常适合进行粒度级工厂和基础架构设计。

对于AEC应用:

  1. DOTS适合处理大型数据集并确保内容的可扩展性。

  2. DOTS非常适合进行大型交互式地图和具有大量模型和重复内容(例如建筑物和道路)的环境设计。

  3. DOTS适用于复杂的工程可视化,可大规模地模拟现实环境。例如,DOTS非常适合进行粒度级工厂和基础架构设计。

对于汽车应用:

  1. 自动驾驶的仿真和可视化,DOTS非常适合进行大型交通和行人模拟,这需要成千上万的志愿Agent以逼真的方式移动和交互。

对于游戏独立开发者和自由职业者:

  1. DOTS可以帮助您减轻游戏中一些高成本操作的负担,并有助于提高性能,尤其是对于一些重复性进程。

  2. 许多轻量级游戏(例如用于移动设备的游戏)并不能最大限度地提高硬件性能。即使有些游戏能够做到这一点,但这可能并不是它的主要关注点。不过,随着游戏的不断发展和硬件需求的持续增加,明智的做法是为将来使用DOTS做好准备。同样,Project
    Tiny也提供了使用DOTS开发较小应用程序和游戏的解决方案。

  3. 如果您没有使用DOTS的迫切需求,那么最好先未雨绸缪,提高自己的DOTS技能,以便在DOTS成为Unity开发的标准方法时能够整装待发。

对于游戏工作室:

  1. 当前格式的DOTS可以帮助您逐步达到Unity或其他方式所无法达到的规模和性能。具体而言,更长的电池使用寿命、温度控制以及DOTS所提供的代码可重用性是其主要优势所在。这些方面的性能改进还使您可以开发更多的低端设备,尤其是在西方市场以外的地区,这些设备会受到一定的硬件限制。

  2. 通过让研发团队以DOTS开展工作,可以帮助您逐步了解所能采取的最佳方法,以及哪些最新的功能和领域最具性能优势和发展影响力。

  3. DOTS并非要取代引擎团队的作用,而是让工程师腾出更多精力在自己的专业领域(例如阴影或着色器)进行创新。


👉壁纸分享

在这里插入图片描述
在这里插入图片描述

总结

在本文中,您已经探索了DOTS并开始考虑面向数据的设计方法是否适合您当前或将来的项目,因内容较多,下篇文章将继续讲解。
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒

Unity DOTS(DOTS: Data-Oriented Technology Stack)是Unity的一种数据导向技术堆栈,它旨在提高游戏性能和可扩展性。它基于实体组件系统(Entity-Component-System,ECS)的概念,其中游戏对象被拆分为实体(Entity)和组件(Component),并通过系统(System)进行处理。 在Unity DOTS中,可以使用实体组件系统来管理和处理游戏对象。通过将游戏对象转换为实体和组件的形式,可以实现高效的数据处理和并行计算。例如,在创建实体时,可以使用GameObjectConversionUtility.ConvertGameObjectHierarchy函数将GameObject转换为Entity,并使用IConvertGameObjectToEntity接口进行自定义转换。然后,可以使用系统(System)对实体和组件进行处理,例如旋转方块事件。 Unity DOTS的优势包括更高的性能,更好的可扩展性和更方便的并行计算。通过采用数据导向的设计,可以减少内存访问和数据处理的开销,从而提高游戏的帧率和响应性。 总而言之,Unity DOTS是一种数据导向的技术堆栈,通过实体组件系统和并行计算来提高游戏性能和可扩展性。它可以通过转换游戏对象为实体和组件的形式,并使用系统进行处理来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [UnityDots技术入门](https://blog.csdn.net/m0_37920739/article/details/108181541)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Unity DOTS简明教程](https://blog.csdn.net/mango9126/article/details/105219215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬夜敲代码的小N

你的鼓励是对我最大的支持,么么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值