面向数据的设计圆桌会议:您的问题已得到解答

12 月,我们与 Stunlock Studios(V Rising)和 Sunblink Entertainment(HEROish、Hello Kitty Island Adventure)举办了以 DOTS 为重点的创作者圆桌会议。我们邀请这些早期采用者分享他们使用 面向数据的技术堆栈 (DOTS)的经验,展示面向数据编程为他们的游戏解锁了哪些特性和能力,并了解他们如何利用 Unity 2022 LTS中的最新实体组件系统 (ECS) 技术。
网络研讨会期间,问答环节气氛热烈,听众提出了许多有见地的问题——问题太多,我们无法现场全部回答。接下来,我们邀请了 Unity 软件工程总监 Joe Valenzuela 和 Stunlock Studios 技术总监 Rasmus Höök 来回答我们在本次会议上最喜欢的一些问题。请参阅下文,并 在此按需观看 “利用面向数据的设计最大限度地发挥游戏潜力” 网络研讨会。

“是立即使用 DOTS 启动新项目更好,还是先使用常规 GameObjects 启动新项目,然后通过迁移到 ECS(纯 ECS 或混合 ECS)来优化性能更好?”
JOE VALENZUELA:ECS、DOTS 和面向数据的设计 (DOD) 不仅仅是为了获得更好的性能。它还可以避免使用面向对象编程 (OOP) 建模问题时固有的复杂性。
任何打算制作多人游戏(尤其是具有权威服务器和客户端预测的游戏)的人都应该认真考虑从 DOTS 开始。实体的 Netcode 提供了一个真正强大、可扩展的系统,允许您编写简单的游戏代码。
如果您没有制作 多人游戏,或者您只是在进行原型设计并希望快速尝试新事物,那么您可能需要考虑利用 MonoBehaviour/GameObjects。
“是否有可能完全在 DOTS 系统上创建游戏,或者 DOTS 仅支持 GameObject 系统?”
JOE VALENZUELA:不,你可能在某个时候需要一些游戏对象。这是我们正在努力的事情。
“开发人员不应该使用 DOTS 的缺点或用例是什么?”
JOE VALENZUELA:你可能问错人了——我想不出在 Unity 中我愿意使用除了 DOTS 之外的其他东西的情况!但是如果你强迫我,我想我会说传统的基于 MonoBehaviour/GameObject 的项目在进行原型设计时确实表现优异。当您预期快速变化时,您不一定想花费大量时间制作 Baker 或设计数据。我们希望在未来简化 DOTS 的一个领域。
“Rasmus,你对提升工程师面向数据编程的能力有什么建议吗?”
RASMUS HÖÖK:我认为一个好的开始就是尽可能编写直接、简单的代码来解决你遇到的实际问题。进入初级程序员的思维模式,编写非常注重结果的代码,目标是让代码按照你的意愿运行。最初的目标不应该是编写可重用的代码、创建抽象或其他什么。
在开始使用 ECS 时,不要过度思考或过度设计。相反,首先使用更大的组件和更大的系统,而不是将它们分成许多更小的部分。这将使你的代码更容易理解。当你有理由的时候再分手。我们确实很早就犯了这个错误。
我认为当你有需要优化的东西时,这是一个练习面向数据编程的好机会。然后您就会有一个实际的问题可以进行实验并测量结果。您还将看到思考数据有多么重要。
“我们听说很多关于使用 DOTS 来扩大规模和构建更具雄心的游戏的说法,但 缩小规模有什么好处吗?就像在小项目中使用 DOTS 来针对低端系统一样?”
JOE VALENZUELA:低功耗系统上的高效运行提高了其可运行的模拟代码的质量。它还降低了电池供电设备的电池要求,从而延长了运行时间并提高了整体系统健康水平。

“从 SystemBase 切换到 ISystem 时,如何处理对托管代码的调用?”
JOE VALENZUELA:从技术上讲,您不需要摆脱托管代码来使用 ISystem – 可以从 ISystem 调用托管代码。它的管理数据不能直接存储在 ISystem 中 - 为此,我将使用托管组件数据。
但是,如果你问,“我如何从 ISystem 中删除对托管代码的调用,以便我可以使用 Burst 并从我的代码中获得最佳性能?” 答案是......这取决于情况。
如果您使用.NET容器,您可能会在com.unity.collections中找到合适的替代品。如果您正在与托管 Unity API 交互并且没有非托管替代方案,有时将工作分为“获取数据”和“处理”阶段会有所帮助,后者是您进行基于 ISystem 的处理的地方。
“我在文档中看到 ECS 与多场景架构不兼容。那么应如何使用 ECS 来实现这种方法?”
JOE VALENZUELA:ECS 中没有任何内容可以阻止添加加载多个 Unity 场景。但是,这些场景不会包含任何 ECS 数据,只包含具有 MonoBehaviours 的游戏对象。
您可以创作任意数量的子场景,每个子场景都会将创作的游戏对象和 MonoBehaviour 数据烘焙成可以在运行时加载的紧凑实体和组件数据。子场景可以进一步分成几个部分,每个部分可以根据需要流入或流出。
“混合单一行为/DOTS 对项目的确定性有多大影响?”
JOE VALENZUELA:确定性不是二元状态,我们不能保证每次运行之间的每个执行细节都是相同的。一般来说,有时需要混合互操作性来呈现粒子系统或音频等细节,而不需要完美的每帧再现。
对于预测游戏等功能,您需要让您的模拟在 ECS 中运行。
如何管理数百个系统?它们是否一直运行,只是在查询中没有实体时不执行逻辑?或者您是否根据游戏状态来激活系统?
乔巴伦苏埃拉:为了便于开发,我们默认进行了系统更新。性能上的差异并不大,但如果您确实有数百个系统,则通过调用 RequireForUpdate 或使用 RequireMatchingQueriesForUpdate 属性使它们进行延迟更新可能会有所帮助。
在这种情况下,习惯做法是向相关系统添加一个 RequireForUpdate<Foo>(),并在场景中使用 Foo IComponentData 作为一种标志来打开这些系统的更新。
“据我所知,DOTS 可以提高在运行时、游戏过程中(尤其是渲染过程中)处理大量数据的性能。不过,我也听说 DOTS 在简化所需的重构方面提高了生产性能。您能否简单谈谈 DOTS 如何帮助重构?”
JOE VALENZUELA:从我的角度来看,DOTS、ECS 和 DoD 的一大吸引力在于,它使你的模拟状态更加可见和可检查。如果您曾经尝试为 OOP 库添加测试,那么您可能会遇到这样的问题:最终您必须模拟或实例化大量功能才能复制调用“简单”方法实例所需的状态。使用 DoD 样式系统,您几乎总是可以将转换内核表示为将一种值类型转换为另一种值类型的独立函数。
这更容易推理、测试和并行化。
“根据我的(业余)经验,我发现 DoD 在数据和架构之间建立了紧密耦合,导致数据结构的变化引入了大量的重构工作。这是你的经历吗?您如何处理或者避免这个问题?”
RASMUS HÖÖK:根据我们的经验,在更改数据时,我们通常必须更改使用它的代码,甚至在使用 ECS 之前。因此,我们遭受的苦难并没有比我们习惯的更多!
JOE VALENZUELA:我认为这不是国防部甚至我们的 ECS 的根本问题,至少随着它的不断发展不是这样的。
首先,OOP 中打破紧密耦合的传统方法通常是创建面向实例的函数和类层次结构。虽然这在理论上很好,但这种抽象是性能编程中首先要考虑的事情之一。
没有什么可以阻止您在 ECS 中编写实用程序函数。虽然在我们的 ECS 中,当您更改特定查询的数据契约时,您必须重新访问系统,但这可能表明您正在以分散的方式查询数据。您是否正在重复转换组件数据?可以重写它以减少每帧的突变次数吗?重复读取组件数据?也许您可以在框架早期将其提升到不可变的数据结构中。
最后,我认为可以肯定地说,DoD,或者至少 ECS,确实使更多问题状态变得明确。这并非负面消息:这是一个不同的权衡。我更喜欢在重构时推理紧密耦合而不是松散或隐含的耦合。
“ECS/OOP 是否适用于手机游戏,或者您能否推荐这种方法用于手机游戏项目?有什么风险或注意事项吗?”
JOE VALENZUELA:我们已有多个客户在其手机游戏中成功使用 ECS。查看 本次 GDC 演讲 ,了解 Sunblink Entertainment 如何将其用于 HEROish。
“您是如何与 V Rising建立联系的?您是否使用了 Netcode 实体或其他框架?”
RASMUS HÖÖK:我们制定了自己的框架。我们很早就开始在生产中使用 DOTS,并且意识到这样做的风险。为了尽可能地消除风险,我们尝试依赖尽可能少的软件包,并在可能的情况下推出我们自己的软件包。我们一直在制作多人游戏,并且一直使用我们自己的解决方案,因此我们很乐意自己做这件事。
“ECS 是否足够稳定,可以用于生产?在过去的几个月里,我们一直在为原型而努力,不确定这是否是我们学习过程中的成长烦恼,或者是否还没有准备好争取纯 ECS 生产项目。”
RASMUS HÖÖK:我想说它已经足够稳定,可以投入生产,但它缺少许多游戏开发商可能认为理所当然的功能。在 《V Rising》中,我们的游戏代码是纯 ECS,但动画角色、粒子效果和 UI 等演示内容都使用了 GameObjects。实际上,我认为混合方法是当今大多数团队启动项目的最佳方式。
我们采用单向方法制作了 《V Rising》。我们仅使用纯 ECS 将数据推送到 GameObjects,从不反过来。例如,我们将角色的状态保存在 ECS 数据中 - 输入、速度等,这将决定运动状态,以及应该在什么时间和速度激活什么动画。然后我们确保 GameObject 的动画师处于该状态。无论动画师处于什么状态都不会影响游戏玩法。我认为这种分离总体上简化了游戏。
JOE VALENZUELA:ECS 已投入生产并被全球客户使用,但我们还有很长的路要走才能获得我们所希望的无缝体验。请继续关注未来的发展 – 感谢您使用 DOTS!
利用 DOTS将您雄心勃勃的游戏变成现实,它使您能够创建可扩展、高性能的游戏和令人难忘的体验。获取 Unity 2022 LTS 的最新功能并试用 Unity 6 Preview中的最新技术。



