支持全球的笔记本电脑游戏玩家畅玩《纪元 1800*》:从 10 FPS 到 30 FPS 的漫长之路

签署人: Philipp Gerasimov IDZSupport KS 已发布: 01/19/2020 最后更新时间: 01/02/2020

作者:Phillip Gerasimov(英特尔)、Frank Hoffmann (Ubisoft*)、Marcel Hatam (Ubisoft*)

Anno 1800 in-game scene
图 1.《纪元 1800*》 游戏场景

关于纪元系列和《纪元 1800*》

“《纪元 1800》— 引领工业革命!”

“欢迎来到工业时代初期。你所挑选的游戏方式将会决定世界的走向。你是一位革新者亦或是开拓者?是暴君还是救世主?如何留名于世将由你自己选择”

《纪元 1602*》于 1998 年首次发行,当时正值即时战略游戏的黄金时代,游戏一经推出便获得评论界的广泛好评,很快成为当时最畅销的战略游戏之一。独特的城市建设、经济模拟和高度详细的图形(该系列后续 20 年保持的独特风格),让玩家们不由自主地爱上这款游戏。该游戏系列的第二部(《纪元 1503*》)延续了这些显著优势,之后该游戏系列历经第一次重大变化,并由此诞生了第三部 — 《纪元 1701*》(又称 1701 A.D.,取决于将哪个港口称之为家)。

游戏不仅克服了严峻的技术挑战,从高度详细的 2D 艺术过渡到精心渲染的全 3D 艺术,还经历了开发人员的变更。前两部游戏来自于奥地利乡村,而《纪元 1701》是该游戏系列中第一部由德国 Related Designs* 开发的游戏。虽然名称发生改变(Related Designs 于 2013 年被育碧* 完全收购,成为 Ubisoft Mainz*),但值得注意的是,许多 2006 年带领该系列游戏实现 3D 过渡的开发人员 13 年后仍然致力于开发该游戏系列。新团队很快崭露头角,于 2009 年推出开创新作品《纪元 1404*》(面向全球受众称为《探索的开端*》;值得庆幸的是,它是该系列最后一部在不同地区名称完全不同的游戏),被广泛认为是该系列最受欢迎的一款游戏。

备受启发的《纪元》游戏系列达到顶峰之后,团队开始探索新领域,2011 年推出了《纪元 2070*》,不仅为该系列融入了科幻元素,支持玩家在海底建造充满未来主义色彩的大都市,还得益于数字发行的日益普及,成功吸引了全球更广泛的受众群体。后来在 2015 年推出了《纪元 2205*》,打造了城市建筑类游戏的又一视觉标杆。

在那之后,团队再次感受到了历史的召唤,溯本回源,重新根植于历史氛围和游戏深度。2019 年推出的《纪元 1800*》让玩家重回工业革命的动荡时代,将人类历史上一个关键时代的所有标志性魅力全部融入到精心打造的 3D 世界中。它还创造了该系列游戏的新记录,成为销量最高的《纪元》游戏,进一步证明了 PC 是当今最具活力和多样性的游戏平台。

支持更多玩家为何是一件伟大而重要的事情

如前所述,《纪元》系列自推出之日起就立志于提供最佳品质的图形,注重每一个最细微之处 — 从工厂忠诚的工人到繁华市场上尽情追逐的猫狗。由于《纪元》系列规模庞大,玩家希望在多个岛屿上建造数百栋建筑(在最近的游戏中,甚至会进入多个并行地图和会话),这一目标在优化和性能方面带来了严峻的挑战。同时,游戏还要在后台处理极其复杂的计算,以跟踪数十个生产链的输出,有时还要跟踪无数市民的输出。

确保游戏在最广泛的硬件配置下运行,不仅能令研发团队产生由衷的职业自豪感,也是出于经济上的需要。

许多《纪元》玩家不属于通常所说的“硬核”游戏玩家(指始终紧跟硬件游戏最新趋势的玩家),他们中的许多人除了《纪元》或其他建筑和管理游戏外,不玩其他游戏。例如,在我们的社区中,许多玩家惊讶地发现,2009 年能够顺畅运行《纪元 1404》的 PC 十年后突然无法正常运行《纪元 1800》。

其中许多玩家并没有配备专门的游戏硬件,甚至都没有台式电脑,但是出于怀旧的缘故,仍然愿意玩新的《纪元》游戏。甚至许多铁杆玩家也发现,《纪元》游戏节奏轻松,而且可以在单人模式下离线玩,是旅行期间使用笔记本电脑在夜间消遣时光的理想游戏。

考虑到所有这些因素,当有机会与英特尔合作面向集成 GPU 优化《纪元 1800》,我们认为这值得一试,而且非常高兴,此次合作帮助我们支持更多的玩家加入《纪元》社区。

初始性能分析

优化工作在 Ubisoft Mainz 进行,由育碧和英特尔工程师组成的合作团队负责。初始测试显示,在英特尔的最新集成显卡上,游戏运行速度低于 10 帧/秒 (fps),性能最低。相比在主流笔记本电脑上获得良好游戏体验,速度慢了 3 倍多!

工程团队决定深入研究,找出性能问题所在,以及如何解决这些问题。为了解 3D 应用的性能,第一步是确定它是 GPU 受限还是 CPU 受限。这两种情况都会导致游戏出现瓶颈,有多种评估方法。

英特尔拥有完备的图形性能分析工具套件:英特尔® 图形性能分析器(英特尔® GPA)包含强大、灵活的工具,可帮助游戏开发人员发挥 PC 游戏平台的全部潜能,包括但不限于英特尔® 酷睿™ 处理器和英特尔® 处理器显卡。英特尔 GPA 工具可显示应用的性能数据,以便您了解系统级性能和各帧的性能问题。

植被渲染

通过使用英特尔 GPA 系统分析器实验,我们清楚地发现,这款游戏完全受 GPU 限制,所以团队深入研究了帧分析。工具很快突出显示,植被渲染消耗了大部分的帧时间。调查绘制调用时我们发现,导致性能低下的原因是特定于硬件的问题。

植被在 Stencil 缓冲区中写入,同时在像素着色器中使用 clip() 指令进行 alpha 测试。对于第 11 代之前的英特尔® 核芯显卡,不建议结合使用状态和指令。结果发现,可以在不使用 Stencil 缓冲区的情况下达到相同的植被渲染质量。稍微更改代码后,游戏现在可以正常运行,性能达到了 20 fps,是之前的 2 倍!

Highest detail of tree mesh shown when the game runs in low-quality settings, 458 triangles
图 2.游戏在低质量设置(458 个三角形)下运行时显示最详细的树状网格。

我们还必须减少低质量设置下树木的数量,以进一步降低植被的性能影响。这尤其适用于游戏的“新世界”设置 — 南美风格的地图,大部分岛屿都被茂密的丛林覆盖。我们还需要禁用草地自动生成器,它通常会将无数个草地和灌木网格分散到空旷区域和森林的边缘,具体取决于摄像头的视角。这些小对象给 GPU 的三角形吞吐量和像素填充率造成了巨大压力。

对象剔除

《纪元 1800》非常注重在屏幕中设置大量微小的视觉细节。玩家从头创建和管理自己的城市,但通常希望摆脱管理的琐事,只沉浸在自己的创作之中。对于引擎来说,这是一个严峻的挑战,因为每一帧都需要标记和渲染数万个动态对象。屏幕上几乎所有的东西都是动态的:游戏中的建筑物由几十个较小的子对象构成,是呈现视觉变化、便于美术师使用、实现游戏相关动画和效果的必要条件。游戏世界里的居民、野生动物和车辆都是如此。我们也需要单独处理树木、灌木和草地,因为必须随着玩家所在城市的发展,以动态的形式添加或删除这些要素。这些数量庞大的对象给我们的游戏性能造成了巨大压力,无论是对 CPU 还是 GPU。

A warehouse building with its sub objects colorized.Most of the sub objects are culled by camera distance.
图 3.仓库建筑物,其中子对象已涂上颜色,根据摄像头距离剔除了大部分子对象。

其中许多对象,玩家只有近距离观察才能看到。我们会根据对象的大小尽早地进行筛选。根据每个对象的边界范围、比例、摄像头距离和摄像头视野 (FOV),估计对象在屏幕上的最终大小。硬阈值可以剔除足够小的对象。几乎达到硬阈值的对象会通过 alpha 混合逐渐淡化,呈现出柔和的外观,因为凸出明显会分散注意力。通过抖动渲染到阴影贴图中,可以使对象阴影消失。

游戏会主动利用几何实例化在一次绘制调用中渲染多个对象实例。这样它能以较少的绘制调用渲染成千上万个对象;例如,渲染一个村庄中同一时间的所有建筑物。这也带来了另一个挑战;这些对象在空间上并不总是彼此接近。如果没有强大的视锥剔除 (frustum culling) 功能,可能会出现某些渲染对象完全不在屏幕中,但 GPU 仍然会发送和转换的情况。

英特尔 GPA 帧分析器的图 4 和图 5 显示了其中一些与剔除相关的问题。它们显示了渲染建筑物的两次绘制调用。可视视口是中间红绿线条组成的正方形。显然,多个实例完全在视口之外。这些实例将在剔除渲染阶段被剔除,但之前的所有阶段,包括几何抓取和 VS 处理,都将在 GPU 上执行。甚至在被发送至 GPU 之前,通过优化实例和对每个实例的边界框进行更好的 CPU 剔除,可以节省多个 GPU 时钟周期。

Initial G P A geometry view.

G P A geometry view showing sub-optimal object culling.
图 4 和图 5.初始英特尔 GPA 几何视图,其中显示了不太理想的对象剔除。

3 D pipe rasterizer hardware metrics
图 6.3D Pipe/Rasterizer 硬件指标。

图 6 显示了 Clipper 硬件指标,可用于英特尔 GPA 帧分析器中的每一次绘制调用。第一个指标显示了 Clipper 调用的总次数,第二个指标显示了剩余的基元数量。在截图 2 提供的示例中,最开始是 190,000 个多边形,后来只剩下大约 40,000,数量仅略超过 20%,提交的工作有 80% 被剔除。

阴影优化

在之前的《纪元》游戏中,我们使用级联阴影贴图,通常由 CPU 代码进行管理,并针对最坏的情况手动进行仔细的调整。对于《纪元 1800》,我们改为使用 Sample Distributed Shadow Map (SDSM)1,Z 预通道完成后,计算着色器通过分析深度缓冲区,动态调整每帧的阴影级联。在几乎所有情况下,这样能够提高阴影的清晰度。例如,在之前的游戏中,阴影总是有点偏移,而且与小投影者(比如居民)断开,因为我们为了处理其他问题情境,需要大量的调整和偏移。SDSM 能够显著改善这些情况,并将阴影和投影者连接起来。

但换做使用 SDSM 会导致一个严重问题:我们再也不能在 CPU 上将对象分区成阴影级联,因为我们再也不能访问级联的分割平面位置。最初,我们只是延迟处理这个问题,将所有的投影对象渲染到每个级联中,导致出现了严重的性能下降,尤其在 GPU 上。我们尝试从视频随机存取内存 (VRAM) 读取分割平面位置,并将它们用于 CPU 分区。然而结果并不令人满意,因为数据滞后了几帧,落后太多。

最后,我们决定使用计算着色器在 GPU 上进行分区。我们在结构化缓冲区中填充所有投影对象的相关信息:Axis-Aligned-Bounding Box (AABB)、变换和着色参数。计算着色器使用该缓冲区,测试每个对象的阴影级联分割平面,然后写入至两个输出缓冲区。对象的变换和着色参数附加到第二个结构化缓冲区中,而字节地址缓冲区中填充绘制参数。最后,我们只用 DrawIndexedInstancedIndirect() 替换常用的 DrawInstancedIndexed() 调用来进行阴影贴图渲染、使用字节地址缓冲区的绘制参数,并从结构化缓冲区(而非常量缓冲区)读取着色器中每个对象的参数。

最初我们只在较低质量设置下缩小阴影贴图的分辨率,但在所有情况下都使用所有 4 个阴影级联。在低端设备上导致出现了多个性能问题。首先,必须检查所有投影对象,看它们需要被渲染到哪个级联中。第二,所有级联边界上的对象也需要渲染两次,每次接触级联时渲染一次。由于《纪元 1800》主要采用自上而下的视角,因此大多数情况下并不需要这么多级联:在自上而下的视图中,单个级联就足够了。只有摄像头朝向地平线时,才需要多个级联来合理分配阴影贴图纹理。

我们根据当前的摄像头间距动态调整了阴影级联的数量(图 7-10)。此外,我们限制了级联的最大数量,仅在最高质量设置下最多使用 4 个级联。对于低质量设置,我们将最大级联数量控制在 2 个以内,这对所有情况来说足够了。

我们还在低质量设置下禁用相邻级联之间的软混合。在高质量设置下,蓝噪声抖动模式混合了级联之间的界限,偶尔非常明显。在低质量设置下,我们认为这些额外的着色器指令得不偿失。

Colorized view of active shadow cascades at overhead camera pitch.
Colorized view of active shadow cascades at slightly downward camera pitch.
Colorized view of active shadow cascades at near-level camera pitch.
Colorized view of active shadow cascades at near-level camera pitch.

图 7-10.四个主动阴影级联的彩色视图,具体取决于摄像头的间距。第四幅图的远处灰色区域没有阴影。

粒子效果和雾

《纪元 1800》是一款关于工业革命的游戏,重工业地区雾霾和污染非常严重。将简单的方框渲染成分辨率为 1/16 的渲染目标,可以达到这种效果。像素着色器射线通过 2D 密度纹理,增加体积噪声,并算上深度缓冲区。之后,放大渲染目标并将其混合到场景中(图 11-13)。即使我们在较低的分辨率下进行计算,在英特尔® NUC 上,射线行进的时间一开始为 8 毫秒 (ms)。由于这种效果对来玩家来说是一个重要的视觉提示,因此我们不能简单地在低质量设置中禁用它。幸运地是,着色器在优化方面拥有很大的潜力:我们增加了射线行进的步距,并进一步限制最大步数。我们禁用了体积噪声计算,这样每个射线行进步节省了 2 个 2D 纹理样本和几个算数逻辑单元 (ALU) 指令。最后,我们禁用了体积阴影,这样每个射线行进步节省了 2 个阴影贴图样本和更多 ALU 指令。

Industrial factory scene without pollution fog.
Industrial factory scene with pollution fog.
Industrial factory scene with pollution fog exaggerated with magenta color.
 

图 11-13.无污染雾和污染雾弥漫的工业工厂场景。图 13 显示了用洋红色放大处理的雾。

添加 LOD

如前所述,游戏中的各个对象都非常详细,包含数千个多边形。当人们缩放至最大后仔细查看这些对象时,这样能够增加大量细节。美丽的建筑和自然的细节可以让玩家觉得他们真正地身处城市之中。但当玩家将视角拉远以便查看更多区域,由于对象的增多,会给游戏性能带来了巨大的挑战。甚至可能在屏幕上,每个对象的顶点数量会超过像素。但是,有一种众所周知的技术可以解决这种细节层次 (LOD) 挑战。游戏应该使用同一模型的不同变体,具体取决于视距。

由于质量原因,我们的美术师手动生成了所有 LOD,并没有使用自动生成工具。制作结束之前,大多数建筑物都没有完整的 LOD 链,因为美术师想在投入精力创作 LOD 之前,首先确定每个素材的最终外观。虽然从制作的角度来看是合理的,但会导致早期性能测试出现问题。

A big draw call showing a high number of building instances.
图 14.一次大型绘制调用,显示大量建筑物实例。

Geometry for the one building.
图 15.一栋建筑物的几何形状。

G P A Frame Analyzer Bar chart, showing group of large draw calls.
图 16.英特尔® GPA 帧分析器条形图,显示了一组大型绘制调用。

Geometry view for each call.
图 17.每次调用的几何视图。

Zoomed in to view one distance.
图 18.放大后查看一处距离。

Example of a high polygon building.
图 19.另一个高多边形建筑物示例。

在低质量设置下,我们将所有素材限制在第三个细节层次上,从而忽略大多数中小型几何细节。LOD 切换会更加主动地进行。为了进一步减少三角形的数量,我们必须为所有素材引入第五个 LOD。

Level of detail of a building mesh with 6000 triangles.
Level of detail of a building mesh with 2100 triangles.
Level of detail of a building mesh with 200 triangles.
 

图 20-22.0、2、4 个 LOD(细节层次)的建筑物网格,其中分别包含 6000、2100 和 200 个三角形。

光照和阴影

我们通常将场景渲染成 RGBA16F 中间渲染目标,在最后应用色调映射。在低质量设置下,我们改为 RGBA8 格式,以加快内存访问速度。由此产生的伪影可以忽略不计:在玩家很少看到的较大的渐变区域,比如天空,色带最为明显。我们用比较简单的变换(仅压缩明亮的颜色,映射曲线的最大部分是线性的)替换了游戏的电影色调映射,从而缓解了色彩精度问题。

低质量设置下,我们忽略着色器照明功能中的各种计算:局部点光源和聚光光源完全禁用;仅考虑定向光照。我们使用硬编码的辐照度光项,不对辐照度立体贴图进行采样。通过噪声纹理样本组成的云阴影也被禁用。我们还尝试简化 Cook-Torrance 镜面 ALU 计算,但造成了极其明显的光照退化,而且并没有显示出显著的性能优势。

海水

我们的海浪由三种不同类型的波浪组成:大型开放水域的波浪由菲利普斯光谱2 的傅立叶变换生成。这些波浪平铺在水面上。在远视距下,我们将它们混合成比较简单的噪声波浪,以防止快速傅立叶转换 (FFT) 波的平铺变得明显。顶部添加了第三种波浪:海岸线、船只和其他对象动态生成的波浪。这些波浪通过简单但高分辨率的 2D 波浪模拟创建,后者动态集成到每一帧,并馈入(A) 水-对象交叉、(B) 渲染到其中的特殊波浪粒子,以及 (C) 着色器生成的海岸线波浪。在低质量设置下,禁用这些动态波浪,可以为每帧节省几毫秒的 GPU 时间。

In-game ocean scene.

 tiled noise pattern in red, tiled F F T in green, and wave simulation in blue.
图 23 和图 24.游戏中的海洋场景,其中三种颜色分别表示形成海洋表面的三个不同部分:平铺噪声模式(红色)、平铺 FFT(绿色)和波浪模拟(蓝色)。

我们还随水块网格进行了微调。最初,大部分海水也在隐藏在岛屿几何形状下方的区域渲染。这导致出现了许多不必要的顶点着色器调用和三角形栅格化,成本极其高昂,因为有大量细粒度水面网格的顶点。缩小水块并优化地形覆盖检查,有助于我们加快水的渲染速度。我们还试图在顶点着色器中输出 NaN(非数),以剔除隐藏在地形下的三角形,但性能没有显著提升,并在一些极端情况下导致出现较小的渲染瑕疵。

Visualization of the rectangular water chunks.
图 25.矩形水块可视化。

结论

临近发布日期时,英特尔和 Ubisoft Mainz 工程师进行了最终性能测试。测试结果显示达到了性能标准,游戏在多种移动笔记本电脑配置下均达到了 30 fps 的运行速度。这是《纪元》系列游戏首次在采用集成显卡的移动 PC 上顺畅运行。两个团队非常高兴完成了目标,而且性能比在工作室进行的初始评估提高了 3 倍!

团队进行的主要性能优化包括:

  • 使用集成显卡优化植被渲染,以实现高效运行
  • 提高对象剔除效率
  • 优化和扩大阴影比例
  • 降低光照与着色复杂度
  • 优化粒子效果和雾
  • 为最复杂对象增加几何 LOD

现在,许多玩家可以在笔记本电脑上运行游戏,体验建造城市、推动经济发展的快乐,享受畅玩《纪元》游戏的美好时光。

Same scene as the title image, but with lowest quality settings, runnable on modern Intel laptops.
图 26.场景与游戏图像相同,但采用最低质量设置,可在现代英特尔笔记本电脑上运行。

参考资料

  1. [Lauritzen2010] Andrew Lauritzen,样本分布阴影贴图,3D 图形与游戏领域的实时渲染进展,2010 年 SIGGRAPH 大会,2010 年 7 月
  2. [Tessendorf2001] Jerry Tessendorf,《模拟海水》,2001 年

产品和性能信息

1

英特尔的编译器针对非英特尔微处理器的优化程度可能与英特尔微处理器相同(或不同)。这些优化包括 SSE2、SSE3 和 SSSE3 指令集和其他优化。对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。该产品中依赖于微处理器的优化仅适用于英特尔微处理器。某些非特定于英特尔微架构的优化保留用于英特尔微处理器。关于此通知涵盖的特定指令集的更多信息,请参阅适用产品的用户指南和参考指南。

通知版本 #20110804