前言
本文主要介绍Unity的多线程式数据导向型技术堆栈(DOTS)。将阐述Unity过渡到面向数据的设计方法的动机、与DOTS相关的关键术语和概念,并借助相关用例,对使用DOTS的优势和风险提供一些简明扼要的指导。
一、使用DOTS存在哪些机会和风险?
在改善Unity项目的绩效方面,DOTS有着巨大的潜力。 但是,在使用DOTS时需要做出一些考量,它们会影响到项目的时间表、预算和开发团队。以下是一些需要与项目优先事项进行比较和对比的事项。这些事项可以归类为风险与机遇。
机遇
改进性能。默认情况下,我们经常使用“性能”一词来描述DOTS。这是什么意思呢?借助面向数据的设计和多线程,DOTS可以显著提升内存、运行时间和电池性能。随着游戏中显示的项目数量不断增加,提高性能的潜力也随之上升。相反,对于项目较少的游戏,您会发现游戏性能的改善程度却不太明显。
代码控制。随着项目规模的不断增大,DOTS可以更好地控制代码的复杂性。为DOTS编写的代码通常可以更好地分离关注点。因此,使用DOTS工作时,代码重构、编写单元测试以及在开发人员之间分配工作就变得更加容易。
风险
如果您不熟悉DoD,那么面对DOTS时就会有一个学习曲线。尽管DoD在计算机科学领域有着良好的根基并已存在数年,而且DoD方法与OOP方法也有很大的不同,但DoD本质上并不比OOP复杂。ECS是一种不同于当前Unity MonoBehaviour方法的代码体系架构,因此学习需要一定的时间。目前,我们认为一名普通的Unity专业开发人员平均需要1个月才能熟练使用DOTS。这一准备时间可以被使用DOTS时的代码质量和性能改进所抵消。当然,具体要取决于项目。
有限支持。DOTS当前仅与Unity中一组有限的功能兼容。 最终,DOTS将与Unity的所有功能完全兼容,但我们目前尚无实现完全兼容的时间表。不过,DOTS允许在单个项目中同时使用游戏对象和DOTS,因此您可以将DOTS用于最频繁的处理任务,而将非DOTS Unity用于其余任务。
二、什如何为使用DOTS做准备?
为了过渡到DOTS需要进行学习。如果您不熟悉概念,使用DOTS时就会困难重重。
当前,还没有简单、现成的解决方案来实现DOTS。在开始使用DOTS之前,一定要了解什么是DOTS,同时还要确定哪些方面能为您带来所需的好处。您可能会发现自己只需要转换项目的某些方面即可使用DOTS,或者您可以决定在许多关键领域使用DOTS方法来启动新的项目。
DOTS的准备工作涉及两个方面:学习面向数据的设计,以及学习如何使用API来实现DOTS。
在开始使用DOTS之前,您需要做很多准备工作。
对于所有人:加深对面向数据的编码方法的理解
从面向对象的设计过渡到面向数据的设计与学习新的编程语言或新的编码方式不同。相反,它是一种编码处理方式以及通过代码来构造信息的表示方式的转变。
即使对于经验丰富的开发人员,转向面向数据的思维方式也具有一定的挑战性。这是因为代码设计实践和行为抽象方式已经成为他们的第二天性,必须重新习惯。针对面向数据的方法,您必须以不同的方式来考虑编码,将对象、类和行为简化为它们所需的数据并加以有效地组织,从而将其转换为首先解决您的常见问题。实际上,这并不是一件小事。随着您的进步,它需要您投入时间并专注于理解数据和学习如何使用DOTS来妥善处理数据。
有关DoD的更多信息,请参阅《面向数据的设计》一书以及这里的外部资源列表。
对于程序员:如果您可以编写代码,则可以使用DOTS
面向数据的设计是一种方法,如果您具有扎实的Unity编码背景,那么您要改变的不一定是编码技能,而是如何将其应用于以数据为中心的方法。
为了获得这些性能的提升,需要对Unity中的代码编写方式做出一些重大变革。首先是如何组织数据。为CPU提供干净的线性数据数组以供读取,而不是在计算过程中从内存的多个位置提取数据,这样显然可以提高性能。通过在内存管理中发挥积极作用,可确保以最有效的方式管理内存。Unity的API中添加了一组新工具,可以让您显式、详尽地管理数据布局和内存管理方式。
您无需重写所有代码,而是只重写代码中那些对性能敏感的区域;对于其他部分,则可以继续沿用原来的Unity方式来编写C#代码。
要了解ECS的基础知识,请跟随我们的实体组件系统教程学习。您也可以浏览我们的ECS项目示例。
三、DOTS的未来在哪里?
DOTS代表了Unity的未来。Unity的架构正在朝着全面采用DOTS的方向发展。这个过程是缓慢的,但现在开始了解DOTS,当我们在Unity功能中全面推出DOTS时,过渡起来就会容易得多。
面向数据的设计(DoD)堪称是实时3D行业的未来。利用DoD原理和实现来解决问题并开发复杂的解决方案已成为大势所趋,尤其是在游戏领域。
例如,瑞典游戏工作室Far North Entertainment就使用了DOTS来解决他们的性能问题,相关说明见“Creating a third-person zombie shooter with DOTS”(使用DOTS创建第三人称僵尸扫荡游戏)。
其他游戏引擎(例如Frostbite和Unreal)甚至也在探索DoD的使用。通过将DOTS引入Unity,让AAA游戏开发的最佳实践面向更广泛的受众推广。
据称使用了DoD的非Unity游戏示例包括:暴雪的《守望先锋》和CD Projekt的《巫师3》。
四、后续步骤
如果您认为自己已经为学习DoD和DOTS做好准备,可以利用Unity提供的许多资源来帮助您入门。
要了解DOTS的技术方面和使用动机,要了解有关DoD的更多信息,可以浏览这里的DoD资源列表及《面向数据的设计》一书。 要了解ECS的基础知识,请跟随我们的实体组件系统教程学习。您还可以浏览我们的ECS项目示例及实体组件系统文档。
为帮助您了解DOTS的实际应用,Unity创建了相应的项目来演示DOTS的强大功能(即Megacity),并提供了DOTS项目示例。您还可以浏览Tiny Racing,它演示了Tiny项目的DOTS实现。
👉壁纸分享
总结
您可能会认为自己还没有为DOTS做好准备,并且可能会担心Unity过渡到全面使用DOTS时自己就会落后。Unity已经承诺会在用户需要时仍为非DOTS工作流程提供支持。这样就为您提供了充足的时间来准备DOTS,因为最终我们希望所有用户都能在某个时候过渡到DOTS。
下篇中,将具体讲解如何使用DOTS,让你的项目如鱼得水。
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒