Case Studies

FromSoftware

编译时间从数小时大幅削减为数分钟,提高PlayStation 3、Xbox 360和PC游戏的开发效率

December 21, 2009 – FromSoftware

摘要

FromSoftware的游戏开发涉及PlayStation 3、Xbox 360、Windows以及其他平台。在本文中,我们将介绍 Incredibuild 如何帮助我们缩短开发过程的编译时间。

概述

近些年来,代码行数剧增,导致编译时间格外长。这是我们所面临的首要挑战。借助Incredibuild,我们将编译时间缩短为原来时间的一半至十分之一。

此外,我们通常需要针对许多不同的平台开发同一款游戏。为了确保最大化的工作效率,就非常需要一个不因目标平台而异的统一开发环境。FromSoftware使用这样的统一开发环境已经有一段时间了。因此,下一个挑战便是在提升速度的同时保持这个我们所熟悉的易于使用的环境。虽然PlayStation 3开发环境中的特殊要求带来了一些问题,但我们仍借助对它们进行了解决。

难点

FromSoftware的电子游戏开发面向的是不同的平台,如PlayStation 3和Xbox 360。这些平台的项目几乎完全由C++源代码构成。就单个项目而言,游戏核心以及其他相关的库和框架的源代码总量可能轻易就超过200万行。

对于诸如此类的大型项目,每次编译通常要耗费数十分钟至数小时不等。为了提高开发效率,我们希望编译时间能够缩短至数分钟。

此外,由于我们拥有面向多个目标平台编译代码库的统一开发环境,该环境中的任何添加元素都必须保证兼容性,且与当前功能无缝集成。

备用方案

为了提高编译速度,我们考虑过以下方案:

在C++编译过程中审查源代码结构。总的编译时间在很大程度上取决于源文件之间的依赖性。因此,我们认为能够通过最大程度降低这些依赖性来缩短编译时间。

但每天会发生大量修改和新增代码, 这就需要大量时间来优化这些依赖性。此外,这种优化限制了代码修改能力,从而极大地妨碍着游戏开发。

提高PC性能。我们都知道,编译时间取决于PC性能。因此,提高PC性能(通过购买新机器的方式来实现)是一个简单直接的选择。但目前Pentium 4是主流CPU,Intel Core系列尚未投入使用。虽然市面上有更快的CPU,但在评估了性价比之后,我们还是决定放弃这一方案。另一方面,内存价格相对低廉,因此我们在这方面进行了尝试。我们通过添加内存并使用RAM盘的方式,取得了一定改善。但同样由于性价比问题,这种方案不具有扩展性。最主要的是,通过硬件升级改善编译时间不是实现我们目标的好途径,更不要说,这种方法的可扩展性明显不足以满足未来较大项目的开发需求。因此,我们也排除了这个方案,尽管其性价比较好。

解决方案

INCREDIBUILD与WINDOWS/XBOX360

在软件开发中,开发PC并不始终全力运行。因此,自然需要收集这些未使用的资源以供编译分配,从而实现资源充分利用。

我们目前主要面向Windows和Xbox 360平台开发游戏,PlayStation 3游戏的开发仅处于起步阶段。因此,我们首先将Incredibuild集成到了我们的Windows和Xbox 360分布式编译的工作流程中。

结果取得了巨大成功。我们成功令这两个平台的编译时间得到显著改善。

PLAYSTATION 3

PlayStation 3平台中的编译时间问题较为严峻。它不仅未能受益于分布式编译,而且就算使用原来的非分布式编译,所耗费的时间也比其他平台要长。

那个时候尚未面市。因此,我们使用了另一项分布技术来克服这个问题。这项技术在一定程度上让我们能够继续面向PlayStation 3 进行开发。

但在同一台PC上运行不同的分布式编译系统,引发了资源冲突。这显然不是我们所希望的。由于我们的开发面向的是多种不同的平台,我们无法将这些PC简单地划分为不同的组并在每个不同的组上运行每个系统。另外,为同一目的保持两套系统,也没有任何经济收益。

在与Xoreax讨论了这个问题之后,他们慨然推荐我们尝试的alpha版本。如果我们能够使用来分配PlayStation 3编译,那么就能够实现开发基础架构的统一化。

但我们也希望保留IncrediBuild的良好特性,让我们能够在Visual Studio中运行分布式编译,不必分别设置每台参与PC。这是Incredibuild的一个重要特性,有助于提高效率。尽管相比Visual Studio编译代理提供了更为通用的接口,但我们无法原原本本地使用这个接口,否则便会破坏统一的开发环境。

使用Visual Studio的PlayStation 3项目构建过程包含两个步骤。首先,开发环境提供的插件自动生成Makefile。然后,Visual Studio处理Makefile,以调用编译器和链接器。

默认情况下,这两个步骤合并执行,但也可以插入另一个步骤,作为Visual Studio构建事件。

为了集成Incredibuild,我们插入一个构建事件,这个事件自动将原始Makefile替换为我们创建的新Makefile。这个新Makefile会调用来处理原始Makefile,但所有编译任务都通过的Automatic Interception接口分配到其他机器。

这样,我们就最终获得了在外观和体验上均与先前相同的开发环境,同时利用Incredibuild实现了PlayStation 3的分布式编译。

这种方法在我们这里现已使用了两年以上的时间。它已成为我们PlayStation 3开发的事实标准。

深化推广

由于是一个通用平台,我们将其进一步推广到了其他领域。

  • 海量资源数据计算
  • 着色器编译(提高编译速度至关重要,因为着色器因其变体的存在而数量庞大)
  • PlayStation 3分布式链接

在PlayStation 3开发中,较长的链接时间也是一大问题。为了解决这个问题,我们使用 Incredibuild 来分配链接过程。通常,链接是构建的最后一步,经编译的对象文件链接在一起,从而得到最终产品(库或可执行文件),因此,这个过程无法分配。

所以我们在编译与最终链接之间插入了另一个步骤。在这个中间链接步骤中,若干对象文件链接成一个中间对象文件。这样,我们就可以分配这个中间链接过程。在最终链接过程中,这些中间对象文件被链接到一起,形成最终产品。

链接少量大对象文件要比链接许多小对象文件快得多。因此,通过分配中间链接,即便在构建过程中加入了另一个步骤,总的构建时间也得到了大幅缩减。

虽然它让我们无法使用某些链接时间优化方案,但那些方案太过耗时,并不实用。因此,我们还是首选改善链接时间。

总结

面对 Xbox 360 和 PlayStation 3 发布前夕的压力,我们依然将 Incredibuild 集成到了工作流程中,它帮助我们极大地提高了生产效率,让我们能够安全且按时地交付产品。得益于与 Visual Studio 的全面兼容以及的灵活性,我们能够将它们无缝集成到工作流程中,同时开发人员也能够轻松适应这种过渡。

现在,Incredibuild 已成为我们游戏开发的重要组成部分,我们的所有团队都在使用它们。

结果概要

下图显示了在我们的其中三个游戏开发项目中实现的编译时间改善。PlayStation 3 编译中的变化尤其巨大。这为我们的项目带来了高生产效率。

请注意,这是三个不同的游戏名称,因此对于跨平台的编译时间比较而言毫无意义。

Dark Souls
7.8分钟
2.8分钟
Dark Souls II
10.9分钟
2.9分钟
Dark Souls II: SCHOLAR OF THE FIRST SIN
21.8分钟
6.8分钟
Dark Souls III
54.2分钟
13.2分钟