Zugalu娱乐公司如何将《繁荣:重压之冠》的RAM使用量从20GB减少到500MB:《重压之冠》

Jun 25, 2025
繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

繁荣:《重压之冠》是一款具有实时战略元素的中世纪城市建设者。在这款游戏中,王国的命运取决于玩家做出的每一个决定,具有单人和合作多人功能。玩家可以战略性地扩展他们的领土和王国,然后在大地图上进行建设。

当团队开始开发这款产品时,他们在提高性能方面遇到了障碍。经过广泛的测试,他们了解了瓶颈所在,以及他们需要做什么——构建一个动画烘焙系统和a自定义植被系统。以下是他们如何增强游戏中的角色动画。

挑战:

克服由角色动画驱动的性能瓶颈

平台:

PC

位置:

加拿大阿尔伯塔省

项目人员:

16

繁荣:重压之冠:Unity案例研究

一个工作室如何在动画数百个角色的同时优化性能?

随着游戏的成型,Zugalu娱乐团队清楚地意识到,性能将是他们最大的挑战。他们的目标是一个相当低的系统要求——NVIDIA GeForce GTX 750 Ti 显卡作为 GPU 和一个四核处理器,这是一个具有四个独立单元称为核心的芯片,用于读取和执行 CPU 指令。

“任何时候你想要针对一个系统,首选的帧率是 60 fps。”“我们的系统中有一些部分我们无法真正改变,这些部分占用了大量的性能,所以我们必须从任何可以的地方寻找提升,”Zugalu Entertainment 的首席概念艺术家和技术艺术家 Jackie Li 说。

在他们寻找提升性能的领域时,他们决定大量的角色动画是必须修复的,因为它们使用了大量的 RAM,并导致许多玩家系统崩溃。

繁荣:《重压之冠》

结果

  • 将 RAM 使用量从 20 GB 缩减到 500 MB
  • 同时在屏幕上动画化数千个角色
  • 将角色绘制调用的数量从 1000 减少到 20 个实例化绘制调用
  • 将性能从 GTX 750 Ti 显卡上的大约 3.5 毫秒提升到 2080 Ti 显卡上的 0.35 毫秒

从顶点迁移到骨骼烘焙

为了优化角色动画过程,团队建立了一个动画烘焙系统。他们需要在屏幕上同时显示数百个动画角色,最初考虑了顶点动画资产解决方案。这对他们的 VRAM 和 RAM 使用来说是一个巨大的问题。他们找不到其他解决方案,所以决定构建自己的。

对于动画系统,团队开始使用顶点烘焙,这涉及到将他们动画的所有关键帧数据按顶点烘焙。“一个纹理将包含一个动画,但该动画的纹理大小相当大。内存成本是顶点数量乘以烘焙帧数的一个因素。所以,5000 个顶点乘以 100 帧将是一个 6 MB 的纹理,采用 32 位浮点 RGB 格式,”Li 说。“当你需要许多不同的动画乘以大量不同的角色时,内存成本开始变得极端。”

他们需要大幅减少它,但仍然保持使用 GPU 加速动画的能力。他们决定迁移到骨骼烘焙,这提供了一种简单的方法来使用更少的数据,因为 Unity 的网格渲染器使用骨骼来转换顶点。

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

“我们所需要做的就是将网格蒙皮过程,即将3D网格绑定到骨架或装配上,允许网格在骨架动画时真实变形和移动,然后将其转移到GPU上,”Zugalu娱乐的首席技术官Garrett Hau说。

然后他们将每帧的骨骼变换烘焙为纹理。烘焙这种信息节省了他们大量的内存。“通过骨骼烘焙,具有相同骨骼结构的不同角色可以共享烘焙的动画数据。我们有像农民和工人这样的角色,他们的骨骼结构是相同的。我们在多个角色之间重用相同的烘焙数据,以获得更多的节省,”Li解释道。

最后,尽管游戏中有大量的角色和动画,他们将RAM使用量从20GB减少到500MB。

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

烘焙动画的编辑器内预览

受益于GPU实例化

在动画方面,团队专注于皮肤渲染,应用材料、着色器和纹理到网格上,以模拟皮肤颜色、阴影和纹理。Li解释说,“进行基于GPU计算的皮肤渲染的一个好处是我们可以访问GPU实例化。我们不是一次渲染一个角色,每个角色都是一个单独的绘制调用,而是使用一个绘制调用渲染多个具有不同动画的角色。”

这是可能的,因为他们将动画数据、纹理打包成一个单一的纹理数组。这对GPU来说看起来像一个单一的纹理。“使用一个绘制调用渲染每个角色是可能的,但为了更灵活,我们只有四个共享骨骼的角色。”

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

捕获实例化绘制调用

在从顶点烘焙迁移到骨骼烘焙时,团队将角色绘制调用的数量从1000减少到20个实例化绘制调用。“顶点烘焙很困难,因为每个单独的子网格被视为不同的。”一个角色可能有多个部分,每个部分都会有一个绘制调用,"Hau说。

在骨骼烘焙中,这取决于游戏中有多少种不同类型的角色。每个角色最多会是一个绘制调用,因为它将所有子网格合并为一个网格。"例如,"Hau解释道,"即使屏幕上有10种不同类型的角色,每个角色都有多个子网格,绘制调用也只有10个。"

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

"Unity有许多API,正好满足你的需求。这包括从导入的FBX中获取特定信息,轻松切换着色器关键字,以及使用易于使用的检查器API创建自定义编辑器工具。"

Jackie Li
Jackie Li - Zugalu Entertainment
Lead Concept Artist and Technical Artist

构建矩阵变换

学习网格蒙皮帮助团队克服了他们的大动画障碍。他们使用Unity API来帮助他们。

要获取骨骼变换,他们访问了SkinnedMeshRenderer.bones.的公共属性。此API返回一个变换数组,包含与其他GameObject变换相同的信息。为了性能测量,他们使用了Unity Profiler的自动检测功能,检测在本地网络上运行的开发构建。这使他们能够在最低要求的系统上对游戏进行分析,同时从主计算机工作。

性能测试团队还应用了 ProfilerMarker.Begin()ProfilerMarker.End() API来采样每帧的性能。这些可以通过创建一个ProfileMarket.struct来使用,然后在他们想要测试CPU计时的地方插入之前的两个方法调用。然后这个结果出现在Unity Profiler中。

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

Li说,"Unity的API非常棒。它们帮助使开发的某些部分无缝。"团队遇到的一个bug是与GPU中的坐标空间有关。“我们获得了世界空间,但我们需要骨骼空间。”

在烘焙过程中采样骨骼变换的帧时,他们需要相对于初始骨骼位置的变换,称为绑定姿势。为此,他们构建了一个矩阵变换。首先,他们从 SkinnedMeshRenderer.sharedMesh.bindposes 中获取绑定姿势矩阵。然后,他们将骨骼的世界变换矩阵与绑定姿势变换矩阵相乘(例如,boneTransform.localToWorldMatrix * bindpose)。

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

Shader Graph 中角色着色器的编辑器镜头

“Shader Graph 是 Unity 创建着色器的解决方案,无需深入理解着色器代码本身。这非常方便,因为我们不需要自己重写整个着色器。”

Garrett Hau
Garrett Hau - Zugalu Entertainment
CTO

轻松创建着色器

在制作动画着色器时,团队选择了 Shader Graph。“这是 Unity 创建着色器的解决方案,无需深入理解着色器代码本身。这非常方便,因为我们不需要自己重写整个着色器,”Hau 说。

对于网格蒙皮,他们必须进行大量的着色器数学,而 Shader Graph 提供的节点使他们能够完成这一任务。Li 解释说,“这是纹理采样和矩阵数学。如果你想的话,你也可以使用 Unity 的自定义函数节点来编写代码。”

对于编辑器工具,动画导演有特定的要求来烘焙动画,因为他自己创建了所有动画。“使用 C# 和 Unity 的 API,开启和关闭着色器的插值非常简单。他们还帮助我们更改要烘焙的骨骼数量和要烘焙的帧数,”Li 说。“用户友好的 Inspector API 使这些编辑器功能能够轻松添加到烘焙工具中。”

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

在Shader Graph中采样矩阵纹理

保持乐观和专注

在一天结束时,尽管游戏开发充满了起伏,团队将GPU性能从GTX 750 Ti显卡的约3.5毫秒提升到2080 Ti显卡的0.3毫秒。

正如李所说:“我们对性能节省和游戏的最终效果感到非常兴奋。”

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

繁荣:沉重的王冠 | Zugalu娱乐 | PlaySide工作室

立即下载 Unity Pro

开始创建与大型工作室发布的质量和成功相竞争并超越的游戏,借助强大的工具、支持、经过验证的合作伙伴和充满活力的社区。