《天命:归来》移植到Switch的故事——来自Saber Interactive的案例
在2024年3月,Nintendo Switch上发布了《王国来临:救赎》。这款历史角色扮演动作游戏的原版于2018年首次上线。关于移植工作的进展,Saber Interactive在独联体和东欧地区的业务发展总监珍娜·戈兰斯卡在其为App2Top撰写的专栏中进行了讲述。
珍娜·戈兰斯卡
在复杂性和规模上,将《王国来临:救赎》移植到Switch的工作可以与我们在2018-2019年期间进行的《巫师3:狂猎》的移植工作相提并论。
这两个项目都是具有广阔开放空间、大型详尽城市、复杂建筑以及大量NPC的角色扮演游戏。
正如托马斯·摩根在Digital Foundry的移植分析中成功指出的那样,将《王国来临:救赎》移植到Switch是“不可移植的移植”之一,顺便提一下,《巫师3》也是这样。
我想提醒一下,Switch是基于为ARM处理器移动设备开发的Tegra X1系统而构建的。明年,这个系统将满10岁。
至于《王国来临:救赎》,这款游戏不仅是为x86处理器设计的,后者有其特定的指令集和微架构,而且在发布后的多年里一直被认为是一款资源密集型的游戏。
当然,这并不是最大的挑战。目前,从x86移植到ARM已成为通用做法。但这里主要需要理解的是游戏本身的资源密集性及其规模。
对我们有利的一个因素是,《王国来临:救赎》是基于CryEngine 3开发的。在开始工作时,我们对这个引擎已经有了相当深入的了解。在2021年,我们发布了(包括Switch在内的)《孤岛危机重制版三部曲》。
就在三部曲之后,在2022年初,我们开始着手移植《王国来临:救赎》。
负责移植的有两个团队:
- 我们的瑞典工作室承担了大部分Switch引擎适配的任务;
- 直接负责游戏移植的是我们称之为Saber Core的部门。就是他们最终将游戏推向了发布。
移植的基础是同时取自两个版本的游戏:艺术资源来自Xbox版本,而代码和设置则来自PC版本。
在最初的六个月,工作流程大致如下:
- 分析所有资源和使用的技术。
- 制定具体的优化工作计划。
- 确保构建可以在Switch上运行。
- 确保在构建中主角至少可以移动。
对于这些任务,我们算是相对顺利地完成了。最耗时的任务是将Warhorse Studios为自己改编的CryEngine 3版本移植到Switch上。之后,压缩所有数据并优化资源就变得相对简单了。
看起来,一切都做好了,构建存在,可以启动,甚至可以尝试游戏。但实际上,这仅仅是开始。真正的工作阵线,意味着在性能上进行斗争,消除大量视觉伪影和错误,才刚刚显现出轮廓。
是的,由于帧率很低和持续不断的错误,游戏确实很难进行。在那时,《王国来临:救赎》的启动常常导致内存泄漏,从而出现崩溃。
第二个大型工作阶段始于2022年8月,当时Saber Core开始修复问题区域。
这是一项非常繁琐的工作,大致如下:
- 首先,QA专家逐步通关游戏,标记帧率下降的地方;
- 然后,工程师检查这些地方,想出可以谨慎更改的内容,以免破坏场景。
例如,在这一阶段,为了减轻CPU的负担,部分计算被转移到GPU上。
最终,草地上草丛的晃动、面部表情、衣物的摇曳——所有这些并行操作都从CPU转移到了GPU上。
接下来的全球性任务是优化可见和不可见对象——即所谓的遮挡剔除(Occlusion culling)。
想象一下,你的角色站在城市街道上的一面石墙旁边。如果他朝向石墙,你只会看到墙体,而无法看到墙后面的物体。但是,显卡仍会绘制位于墙后面的对象,计算建筑、其他角色和物体。
这是所有平台(包括PC和最新一代的游戏机)面临的大问题。这也适用于Switch,对于它来说,额外的计算是一种奢侈。因此,尽可能地,新版本的游戏在剔除不可见部分时变得更加高效。
一个最能说明问题的例子是关于绵羊的。在《王国来临:救赎》中使用了非常高质量的物理模拟。例如,当你看到一只在草地上奔跑的绵羊时,游戏会进行大量计算,以正确模拟草的运动,每只羊蹄将落在何处。
每只绵羊的腿要进行5000次计算。乘以四只腿就是20000次计算。现在想象一下,你的角色遇到了一整群绵羊……
因此,为了提高性能,我们减少了类似的计算次数。可以说,从5000次计算减少到1次。
然而,这导致了一个我们完全没有预见到的结果。在减少了计算后,马的腿突然出现在地形中。
最终不得不手动修复这一点:一一查看每个场景,确定可以改变计算数量的地方和不能改变的地方。
另一个严重的问题是衣物和盔甲的正确显示。游戏中有一种与历史现实相近的出色盔甲系统。衬衫、内甲、链甲、金属护手和护腿——所有这些都有自己的几何形状,并单独计算,以便正确显示。
这些计算在实时中进行,因为盔甲随时可以从被击倒的敌人那里脱掉、被盗或者穿上。
当然,可以简化几何形状,但这可能会破坏物理计算系统:在移动时,盔甲看起来将不再像真实的,而是像“橡胶制的”。最终不得不寻找其他解决方案:进行更快的计算,并非常精细地剔除不影响几何形状的部分。
当然,有时不得不采取一些窍门。例如,游戏中的所有剧情动画都是单独导演的——这意味着我们知道一切将如何进行,可以稍微调整质量设置,比如在不显眼的地方削减绘制距离。
在某些地方,我们则采用了直接的方法:在复杂场景中使用低动态分辨率,额外减少纹理的大小,缩短绘制距离,使用低质量阴影等等。
最棘手的问题是大规模场景:战斗、比赛、任何出现超过五个角色的事件。缩减角色数量的想法被直接排除了,因为那样会影响画面的观赏性。
我们尽力去最大化优化这些角色。然而我必须指出,他们仍然是游戏性能的瓶颈。幸运的是,游戏的节奏本身不快,因此在这些时刻,游戏性并没有受到太大影响。
总体而言,正是凭借这种细致入微的方法,我们能够在几乎整个游戏过程中取得可接受的性能。在开放空间中,《王国来临:救赎》的帧率大致稳定在30帧。
考虑到游戏的复杂性,我们认为这是一个成就。而且我们对游戏的稳定性也非常满意。自工作开始以来,团队就开始优化内存,确保游戏至少可以运行两个半小时(Switch的标准电池工作时间)。
在内部测试中,我们实现了20小时的连续游戏。当主机电池耗尽时,我们会在不关闭游戏的情况下进行充电,随后继续游戏。可以说,我们从主机的性能中榨取到了极致。