Highstreet Market 如何利用 ECS 为 Unity 扩展 VR MMO

Highstreet:Calamity 是 Highstreet Market 下一代 MMORPG 的城市规模切片。团队将其发布给玩家社区,以测试核心功能,如战斗和进展。
在这个阶段,团队专注于扩展多人游戏体验。在开发过程中,他们遇到了技术瓶颈,但通过仔细的分析和迭代,他们识别并解决了根本问题。他们是如何做到的。
挑战:
在扩展游戏时克服计算和渲染障碍
平台:
VR
地点:
加拿大温哥华
项目工作人员:
30(10 名艺术家,10 名工程师和 10 名设计师)
Highstreet:Calamity:Unity 案例分析
一个工作室如何在克服技术挑战的同时扩展多人开发?
当他们开始建立网络游戏时,团队面临两个主要挑战:计算和渲染效率低下。
“在计算方面,我们最大的挑战是高效处理计算。这对于我们的服务器尤其如此,它负责模拟世界,”Highstreet的首席技术官Jack Qiao说。“随着我们增加更多玩家和网络实体,服务器在高效处理所有这些内容时遇到了困难。”
在渲染方面,构建大型沉浸式VR世界是困难的。“VR要求一个引人入胜的环境,里面有许多物体和兴趣点供玩家探索,”Qiao解释道。“但是独立的VR硬件与现代PC GPU相比,GPU性能有限,这限制了我们可以渲染的内容。”
为了保持质量,团队仔细设计场景,使其从各个角度看起来都不错,同时平衡VR固有的性能限制。

结果
在最优化的游戏区域达到72帧每秒
将可脚本渲染管线(SRP)的绘制调用数量从80减少到5
将单个网格中的三角形数量从200万减少到50万
采用ECS用于Unity以提高网络效率
团队首先在Mirror的传输层上构建了一个自定义服务器,以处理数据流和游戏逻辑。“当时,大多数网络工具是为休闲移动游戏设计的,而不是大型MMO,因此我们不得不创建自己的工具,”Highstreet的首席技术架构师Omar Sleam说。
当Unity推出了为性能和大规模游戏构建的生产就绪框架Netcode for Entities时,团队看到了转向Unity的实体组件系统(ECS)和Netcode for Entities的机会。该框架以可扩展性为设计理念,引入了分块,将复杂的游戏数据分解为更小、更易管理的单元——这是团队认为对他们的MMO至关重要的。
“使用Netcode for Entities,数据仅发送给范围内的玩家,而不是广播给整个服务器,”Sleam解释道。“它也是多线程的,这使得服务器操作更加高效。”
除了网络,团队还开发了一个完全基于ECS的行为树系统用于Unity。之前的迭代使得实现通用功能变得困难——特别是与流程控制相关的功能。基于Unity的自定义ECS行为树解决了这一限制,提供了灵活、可重用的工具,而不影响性能。

Highstreet:灾难 | 高街市场
团队设计了系统,以便在网络环境中无缝运行,灵活地在服务器、客户端或两者上运行行为树。这使他们能够将非关键行为卸载到客户端,提高性能,同时保持核心游戏逻辑的集中控制。
为了管理游戏的基于会话的结构,团队依赖于Unity的多人服务生态系统。Multiplay托管启用了动态服务器分配,这对于游戏的基于会话的特性非常理想。“自动化减少了我们的DevOps负担,让我们专注于构建游戏本身,”Sleam说。Matchmaker用于根据设置和位置等各种因素对玩家进行分组,帮助确保平衡和低延迟的比赛。
Unity Lobby为派对系统提供支持,以便玩家在加入游戏会话之前可以形成和管理小组。Friends与Lobby集成,以在不同服务器之间维护派对,使玩家能够保持连接,最小化实现工作量,而无需自定义后端。
这些工具共同提供了一个完整的多人游戏基础架构——涵盖托管、匹配、派对管理和社交系统——同时保持实现轻量、可扩展,并优化高性能游戏玩法。
通过ECS for Unity改善模块化
虽然团队在从基于GameObject的设计过渡到ECS for Unity时经历了陡峭的学习曲线,但一旦他们上手,生产力显著提高。
“ECS for Unity减少了很多开销——部分是由于其架构,部分是因为我们转向了自上而下的设计方法,”Qiao说。“与GameObjects不同,GameObjects通常会导致重复逻辑,除非经过仔细架构,ECS for Unity强制执行模块化、基于组件的设计。这自然促进了更清晰、更易维护的系统。”
团队分享了使用ECS for Unity的最大好处之一是处理游戏设计更改的容易程度。“在旧系统中,更改通常需要修改多个MonoBehaviour脚本。使用ECS for Unity,许多更改可以通过简单地添加或删除组件来完成,因为行为由与这些组件链接的系统驱动,”Qiao说。“总体而言,ECS for Unity的可修改性和可扩展性大大提高,使我们的开发流程更加高效。”

团队还解决了游戏架构方面的一个重大挑战。与传统软件不同,游戏逻辑不仅依赖于代码,还依赖于代码的位置。例如,将旋转脚本附加到汽车轮子上可以模拟运动,但将相同的脚本应用于天空盒可以驱动昼夜循环。这种空间和层次依赖性意味着团队需要一种方法来构建系统,不仅在代码中,还在放置和层次方面。
为了解决这个问题,团队中的软件架构师Mohamed Hamdy设计了一种基于图形的ECS方法用于Unity。这种方法允许团队以可视化、模块化的方式设计实体、组件、作者和系统,同时定义它们的放置和设置。通过这样做,小的可重用代码块可以根据应用的位置实现非常不同的目的。
该系统后来扩展到不仅集成Unity的ECS实体,还集成MonoBehaviours、GameObjects、行为树和Unity的行为图。通过结合Lucidchart图表和Excel表格,团队以清晰高效的方式绘制和验证了整个游戏的架构。展望未来,他们计划构建一个专用的Unity工具,使这种架构方法在编辑器中完全可见,并能够与实际实现进行验证。

Highstreet:灾难 | 高街市场
使用混合架构系统
在从自定义服务器迁移后,团队最初采用了完整的ECS for Unity物理方法。他们选择这种方法是因为其高效的数据处理和可扩展性,特别是在服务器端,但也因为某些CPU端的渲染优化。
“一个关键优势是在处理皮肤网格动画时通过顶点动画,ECS for Unity可以比传统的基于骨骼的系统更高效地处理,”高街市场的技术艺术家Alwin Joshy说。“然而,在VR中,CPU和GPU都受到限制,为了充分利用基于ECS for Unity的动画,我们首先需要减少场景复杂性以释放资源。”
由于游戏的复杂动画,他们的工作流程演变为一个混合系统,将ECS for Unity与通过实体组件系统(ECS)的MonoBehaviours结合起来。
为了在屏幕上可视化多个角色,他们将一些处理卸载到GPU上。由于显然CPU会因网络和游戏循环的逻辑方面而过载——他们采用了Rukhanka动画系统。
“对于物理,我们在主要物理世界上构建了一切,实时同步服务器和客户端之间的所有物理实体,”Sleam解释道。“起初这很复杂,因为服务器同步了每个物理实体。然后我们探索了多个物理世界,并面临在ECS for Unity中继续使用本地物理计算器或在MonoBehaviour中进行本地物理的选择。”
MonoBehaviour允许与第三方VR工具如Hurricane和Freehand集成,这些工具能够实现逼真的物理交互,例如按按钮或确保手不会穿过墙壁。另一方面,ECS for Unity要求团队从头开始构建这些系统,因为在商店中没有像MonoBehaviour那样现成的第三方工具。
“最后,我们使用MonoBehaviour进行客户端VR交互,如手部碰撞,以确保响应性和沉浸感,”Sleam说。“与此同时,服务器端物理处理关键的游戏交互——例如击中怪物——以进行验证。”
这种混合方法在沉浸感与安全性之间取得平衡,在服务器上运行游戏关键的碰撞检测以防止作弊,同时在客户端管理本地的、较不关键的交互。

减少绘制调用以实现稳定的VR性能
虽然ECS for Unity和Rukhanka为规模提供了可能性——例如支持数千个动画角色——但团队在VR中的最大挑战之一是性能优化,尤其是在紧张的CPU/GPU限制下。
“与传统游戏不同,VR完全消耗CPU和GPU,”Joshy解释道。“除非场景高度优化,否则卸载并不总是一个选项。”
在构建项目后,他们首先使用Meta Quest上的OVR stat工具进行初步性能检查,以识别重负载区域或帧下降。然后,他们创建开发版本,并将Meta Quest连接到Unity Profiler,以分析CPU-GPU数据传输、纹理内存使用、渲染层次结构和绘制时机。

一种使用纹理数组而不是纹理图集的特殊着色器
“为了提高性能,我们最近专注于通过手动控制渲染来减少绘制调用的中断。光照是一个主要挑战——虽然我们最初使用卡通风格压缩烘焙光照贴图以减少大小,但混合光照贴图和非光照贴图对象导致了着色器变体问题,”Joshy说。“为了解决这个问题,我们完全放弃了光照贴图,采用了完全环境光照的卡通着色器。这使我们在性能上更加一致,并更好地控制渲染。”
团队还使用了具有阶梯衰减的聚光灯,并保持其着色器变体最小化——仅为不透明和透明剪辑使用一个单一的卡通着色器,可能还有草地。他们手动控制绘制顺序:不透明对象在第1层,透明对象在第2层,剪辑对象在第3层。这有助于通过保持批处理一致性来减少绘制调用的中断。
“为了捕捉分割绘制调用的隐藏问题,我们在很大程度上依赖Unity帧调试器来验证批处理和绘制顺序,”Joshy继续说道。“GPU分析也是我们优化渲染和减少绘制调用开销的主要工具之一。”

在编辑器中的截图,显示材料数据如何加载到GPU缓冲区,并使用添加到修改后的UV2 x、y和z值的ID进行读取。
平衡灵活性和性能
随着团队规模的扩大,他们遇到了渲染挑战,特别是在进行战斗的竞技场场景中。
“我们的目标是在像Meta Quest 2这样的设备上保持72帧每秒,但即使三角形数量低于500,000,我们也遇到了性能问题,”Joshy说。
他们正在使用SRP批处理器来减少GPU着色器切换,但在独立VR中,GPU的限制比PC上要严格得多。“我们发现即使是有两百万个三角形的场景也能流畅渲染——如果它是一个单一的网格,只有一个材料。但我们游戏的开放、垂直环境使得这种简化变得不切实际,”Joshy说。
为了提高性能,团队专注于通过以下方式最小化绘制调用:
艺术团队的自定义网格烘焙
将资产分组为子网格,以平衡批处理与材料灵活性
将世界分块并生成块级LOD,而不是每个资产
使用ECS流式传输块,以便与Unity兼容的系统
仅使用LOD系统帮助将场景从约两百万个三角形减少到500,000。
这种方法牺牲了一些灵活性,并增加了艺术家的工作量,但考虑到硬件限制是必要的——尤其是在像Meta Quest 2这样的设备上,开发者无法升级GPU。
“最终,将绘制调用从80减少到5是我们最大的胜利,”Joshy说。“我们正在围绕这一点重组内容和工作流程——即使这限制了材料的多样性——因为这是在当前硬件上实现稳定VR性能的最可行路径。”

编辑器中的截图显示:1.所有实心物体如何在5次绘制通道内绘制,以及透明物体的数量大大减少。如何使用自定义工具覆盖调整绘制顺序,绘制队列编号基于一个约定的任意数字,该数字大致在其他物体之前绘制某些类型的物体。
以智能的方式进行缩放
随着团队开发他们的VR MMORPG,他们继续关注他们认为最关键的考虑因素——从架构和图形的角度进行缩放。
“如果你从第一天就瞄准大规模MMO,你将需要ECS for Unity来处理高实体数量和并发网络。”如果你一开始没有非常详细的愿景,逐步缩放也能很好地工作,”Qiao说。“我们最初采取了“0到100”的方法,早期优化以达到峰值规模。事后看来,我们过早地构建了基础设施,消耗了本可以用于游戏玩法和内容的资源。”
从图形的角度来看,团队意识到VR的优缺点。“有机的、柔软的网格消耗大量计算资源,并且在VR中表现不佳。我们的游戏使用了带有有机元素的卡通风格,这限制了我们在角色或环境设计等其他领域的图形预算,”Qiao说。
总体而言,团队建议选择更干净、低细节的技术风格环境,以最大化VR游戏的性能。“通过更干净的场景设计和世界构建,你将能够拥有更多的图形,以及用于角色设计和结构设计等其他事物的资源和图形预算。以性能为导向进行设计是关键,”Qiao说。
立即下载 Unity Pro
借助强大的工具、支持、经过验证的合作伙伴和充满活力的社区,开始制作出品质和影响力都比肩乃至赶超大型工作室游戏大作的游戏。