并非一日建成 - 《全面战争:罗马 II》中吸取的教训





0/5 (0投票)
本案例研究详细介绍了游戏如何充分利用低功耗系统,同时又能出色地适应更强大的系统,呈现出精美的画面和流畅的运行效果。
摘要
Creative Assembly 的开发人员面临着一个挑战:如何在不影响游戏美感的前提下,让《全面战争:罗马II》在各种 Intel® 系统上都能流畅运行?本案例研究将详细介绍游戏如何充分利用低功耗系统,同时又能出色地适应更强大的系统,呈现出精美的画面和流畅的运行效果。
高保真度的地形是游戏丰富的历史环境的重要组成部分,而茂密的植被是这些地形的关键。通过采用自适应顺序无关透明度 (AOIT) 技术优化了植被,使其在保持低性能开销的同时,呈现出丰富的外观。团队增加了一个游戏基准测试,方便测量性能。游戏内电池指示器可让玩家在旅途中监控电量。他们还针对多种不同系统进行了调优,以确保所有优化都能在各系统之间取得平衡,并添加了检测代码,为每个系统自动设置合适的选项。
团队在许多其他方面也进行了改进,包括 LOD(细节层次)、阴影、地形生成、粒子、CPU 任务和声音。他们还优化了内存带宽。
这些改进共同为游戏在各种 Intel 系统上带来了出色的性能。
挑战
在开发《全面战争:罗马II》时,Creative Assembly 向 Intel 发出了挑战。他们希望在所有类型的系统上提供迄今为止任何《全面战争》游戏中最具沉浸感的游戏体验,并且不打折扣。但当今的系统具有各种特性,并且有多种外形尺寸。他们如何在所有这些系统上以流畅的帧率提供出色的游戏体验?他们转向了 Intel 的工程师。我们共同推出了一款出色的游戏,玩家可以从最新的 Intel 系统全系列中尽情享受,从最省电的 Ultrabook™ 到全功能的笔记本电脑、一体机和台式机系统。
团队将他们的需求放在一个滑块上,功能更强大的机器能够提供更快的帧率、更高的分辨率和更高的画质设置。由于游戏在功能更强大的系统上运行速度更快,因此会启用高级功能,从而使游戏以更高的画质进行渲染。这包括基于 Intel® Iris™ 图形扩展的 AOIT,用于像素同步,这使得具有 Intel 图形的系统能够更快地进行透明度计算。
为确保游戏能在广泛的系统上运行,游戏会自动配置以匹配每个系统。当系统使用电池运行时,游戏会显示一个电池指示器。罗马 II 还包含一个内置的基准测试模式,以便任何人都可以查看游戏的性能。
团队使用 Intel® Graphics Performance Analyzers (Intel® GPA)、Microsoft GPUView 和 Intel® VTune™ Amplifier XE 研究了游戏的 GPU 和 CPU 性能。
在阅读本案例研究时,您应该会发现与您的游戏开发有相似之处。希望本案例研究能帮助您在您的游戏中实现类似的功能。
平台检测
通过类似 GPU Detect 代码示例的代码,罗马 II 可以检测系统的图形设备。利用这些信息,游戏会根据每个系统的最佳视觉保真度进行自我配置。在配备 Intel® HD Graphics 4200/4400/4600(通常为使用 15W 功率的系统)的系统上,游戏默认设置为 1366x768 分辨率和中等画质。
对于配备 Intel HD Graphics 5000 和 Iris Graphics 5100 的系统,游戏会自动设置为 1600x900 和中等画质,并增强阴影保真度。
在配备 Iris™ Pro Graphics 5200 的系统上,游戏默认设置为 1600x900 和高画质,并使用 AOIT 来获得更好的视觉效果。
大量的基准测试证明,在所有这些配置下,游戏的帧率都很高(对于至少 95% 的典型游戏玩法,帧率 >=30 FPS)。
通过基准测试设定标准
为了更轻松地衡量游戏在各种系统上的性能,《罗马 II》包含了一个基准测试,用于展示战役场景中的典型性能。转到高级图形选项屏幕并选择“运行基准测试”。为了进行更简单的基准测试,也可以从命令行启动。虽然游戏附带一个基准测试,但它有一个基准测试选择屏幕,因此可以运行其他基准测试。
基准测试不直接测量功耗。如果您想在游戏过程中研究功耗,请运行基准测试和功耗监测工具(请参阅 Intel® Graphics Performance Analyzers (Intel® GPA) 系统分析器以进行实时功耗测量)。
我们建议您构建一个类似的基准测试(加上一个基准测试运行工具),以展示您游戏的典型性能。
我们拥有电力
为了展示游戏在电池供电下能持续多久,《罗马 II》包含一个电池指示器。如果电池已充满电并连接到交流电源,则隐藏该指示器。任何时候,当 Ultrabook 或笔记本电脑系统正在使用电池供电或通过交流电源充电时,都会显示电池指示器,以便玩家知道他们还可以玩多久。电池指示器已集成到屏幕中,因此不会隐藏任何重要信息。
一些游戏通过降低分辨率和画质设置或降低帧率来适应电池供电。这些策略在《罗马 II》中并未带来令人满意的游戏体验,因此团队没有包含任何特定的电源优化。
在开发您的游戏时,请研究它如何使用电源,看看其中一些优化是否适合您。
AOIT 让植被看起来很棒
《全面战争》系列游戏以其逼真的植被和沉浸式的环境而闻名。这种美学需要大量的透明度。
为了让游戏在 Intel 图形硬件上呈现最佳效果,它使用了 Intel Iris 图形扩展到 DirectX* API。像素同步扩展提供了一种低开销的方式,通过图形驱动程序同步像素写入,从而加速了透明度。
游戏最初使用 Alpha-to-Coverage 解决方案来处理透明度。团队计划在罗马 II 中用 k-buffer 解决方案来补充。他们发现,k-buffer 在屏幕小区域和固定透明度水平下工作良好。然而,在全屏中,罗马 II 中看到的过度绘制级别出现了问题。它很快耗尽了 GPU 内存,因此运行速度非常慢。AOIT 没有这个问题,而且比 k-buffer 快约 5 倍。AOIT 还允许玩家看到叶子边缘周围更多的 Alpha。这提供了更好的深度外观,尤其是在远低于 1080p 的分辨率下。
虽然几年前发布了一个通用的 AOIT 算法,但最近的代码示例详细介绍了如何通过像素同步加速 AOIT。通过像素同步,着色器将颜色和深度写入无序访问视图 (UAV) 缓冲区。最远的颜色会在写入时进行混合。然后,可见性函数 (VF) 将颜色与重构的 alpha 混合方程结合起来。这提供了一种确定且快速的方法来计算透明度。
AOIT 像素同步示例几乎是“直接插入”到了罗马 II 代码库中,只进行了少量更改。《罗马 II》版本的 AOIT 具有预乘 Alpha 并进行了一些剔除。轻松地将光照添加到 AOIT 通道,并让树木植被投射自己的阴影。
对于高端系统,AOIT 现在是透明度的默认设置。所有其他配置都使用 Alpha-to-Coverage。
AOIT 对前景和中景植被进行操作,效果极佳。虽然这张截图看起来很棒,但游戏中的实际动画效果更佳。AOIT 应该很容易集成到您的游戏中。
带宽优化
在研究了游戏之后,我们认为减少 GPU 的带宽可以提高整体性能。通过多个渲染目标,游戏以相同的格式写入单个输出,所有格式大小都相同。由于每个渲染目标都可以具有不同的输出格式和位宽,因此我们更改了游戏,使其选择合适的格式和大小。
地形引擎会生成纹理。它将表面颜色和法线存储为 RGBA 8 纹理,即使 Alpha 通道未被使用。更有效的格式可以减少带宽。
地形采样器使用了手动双线性过滤。团队在 Intel GPA Frame Analyzer 中研究了顶点着色器的配置文件,发现该着色器太慢。它使用 gather4 读取 4 个高度,然后对这 4 个值进行手动双线性过滤。顶点着色器现在有一个具有适当过滤功能的采样器,因此速度更快。
我们发现一些 LOD 模型并非最优。例如,躯干动画模型在整个战役军队中被实例化。但 Intel GPA 显示这些顶点着色器被调用得太频繁了。这是一个常见问题,所以我们通常会检查它。在渲染具有相同网格的相同模型的一组对象时,实例化可能很有效。但是,当对象分散在场景中,且 Z 深度差异很大时,远处的对象通常数量很多。它们被渲染到屏幕的极小部分,产生大量亚像素多边形。尽管实例化减少了绘制调用次数,但这些亚像素多边形的顶点着色器调用次数可能会非常低效。
为避免这种情况,实例化时要注意 Z 深度。对于复杂模型,仅当实例的 Z 深度与原始模型的 Z 深度非常接近时才进行实例化。
总的来说,顶点着色器的调用次数应远少于像素着色器,大量的图元、过滤后纹理像素和读取可能表明存在相同问题。在本例中,顶点着色器的调用次数与像素着色器一样多。为了解决这个问题,游戏切换到了一种更简单的 LOD 模型来处理远距离对象。
阴影
阴影方面也暴露了一系列最终都得到了改进的问题。
我们遇到了级联数量的问题。《罗马 II》使用了级联阴影贴图,这可以在近距离区域提供细节,同时保持大范围的阴影细节。起初,游戏有三个级联,需要进行深度调整以达到最佳效果。通过仔细地划分级联之间的界限,我们将级联减少到了两个。阴影效果仍然很好,但游戏运行速度更快。
阴影生成和主渲染通道具有相同的顶点签名(11 个输入)。这是低效的,因为阴影生成不需要该顶点签名的很大一部分。但是,我们无法简化顶点签名。场景的许多组件需要其纹理具有 Alpha 或穿透区域,因此纹理处理对于阴影创建是必需的。在项目后期,输入签名被分别减少(减少了 3 个 float4),为阴影带来了小幅性能提升。
阴影贴图遇到了与远处实例化对象产生的亚像素几何相同的子像素几何问题。当主场景的 LOD 被调整后(参见上文),阴影贴图创建也得到了类似的改进。通过更改为 LOD 模型,并对远处模型使用代理(impostors),游戏获得了一些小幅的加速。
地形
最初,地形是在屏幕空间中进行镶嵌细分的。这导致了高多边形计数,因此我们用一个平铺渲染器替换了它。这带来了较高的顶点着色器成本,但渲染速度却快得多(在同一场景中从 5.4 毫秒降至 2.4 毫秒)。
《罗马 II》使用了非常大的地形纹理。可见区域是实时生成的。高度和地形信息在 GPU 上合成并存储在纹理图集中,但需要仔细调整。每一帧都会渲染足够多的图块来显示新可见的区域,同时限制其工作量,以免消耗过多的 GPU 并干扰其余的渲染。
粒子
仔细查看典型的帧捕获,发现有一个工作量很大的部分对帧的影响很小。
这是由于粒子,每个粒子都被绘制为一个单独的多边形。它们对场景没有影响,因此可以移除它们以获得极大的速度提升。
尽管粒子似乎与 AOIT 的交互效果不佳,但为游戏开发的新粒子引擎运行良好,并且与 AOIT 没有问题。
调优 CPU 端代码
尽管在此项目中图形受到了广泛关注,但团队还希望优化《罗马 II》的 CPU 端。通过 Intel® VTune™ Amplifier XE,团队研究了游戏中的 CPU 瓶颈,并在几个区域取得了显著的收益。
声音引擎占用的 CPU 时间比预期要多。虽然它是一个强大的声音引擎,能够进行复杂的 CPU 混音和混合,但即使设置为“正常”级别,它也以最高详细级别运行。修复此问题后,帧率提高了高达 1.1 倍。低功耗系统因此受益,获得了更好的帧率和更长的电池寿命。
游戏包含一个基于任务的线程系统。任务大小各不相同,其中一些任务与任务池的自动任务调度不兼容。这导致了调度中的“气泡”并减慢了帧率。将有问题的任务从任务列表中移除,并将其单独安排在一个独立的线程上,与其他所有任务分开。这实现了最优的线程调度。
结论
Creative Assembly 和 Intel 携手合作,在开发过程中仔细研究了《罗马 II》。利用 Intel GPA、Intel VTune Amplifier、GPUView 和深入分析,团队发现了许多需要改进的地方。团队共同调优了游戏的许多部分,并集成了行业领先的算法。
由于游戏会自动为每个系统进行配置,因此在许多情况下其速度比原先更快。电池指示器和游戏内基准测试使得可以在游戏过程中或用于基准测试时研究游戏。
植被受益于 AOIT,LOD 被隔离到正确的深度并在远处替换为代理(impostors),阴影运行速度大大提高,地形和粒子系统运行得更好、更快,声音和任务系统在正确的时间使用正确的工作负载。
总而言之,这一切都使得《全面战争:罗马 II》在 Intel 平台上看起来和运行得都很棒。我们希望本案例研究能帮助您在下一款游戏中也做到这一点!请告诉我们您的想法。
非常感谢 Creative Assembly 构建了一个出色的系列游戏,并为《罗马 II》在 Intel 平台上的出色表现做出了贡献。特别感谢 Intel 的 Steve Hughes,他与 Creative Assembly 在多款《全面战争》游戏上合作,为《罗马 II》带来了迄今为止最好的成果。
Intel、Intel 标识、Iris、Ultrabook 和 VTune 是 Intel Corporation 在美国和/或其他国家的商标。
版权所有 © 2013 英特尔公司。保留所有权利。
*其他名称和品牌可能被声明为他人的财产。