在 20 世纪 90 年代中期,我曾为一家开发多媒体信息亭演示的公司工作。我们最大的客户是英特尔,我们经常制作演示,这些演示会出现在主要电脑零售商(如 CompUSA)的终端展位上的新 PC 中。当时,从商业到消费,所有应用类别都对性能有需求。我们制作的演示展示了,例如,与前一年的处理器相比,新处理器上的电子表格重新计算速度有多快(在当时,这必须手动完成)。即使是普通的观察者也能立即注意到这些差异——而且这很重要。对于以前需要 20 秒或更长时间才能完成的事情,现在只需等待 10 秒,这是一个重大的改进,并促使许多消费者和企业升级他们的 PC。
自从那时以来,情况发生了很大变化,除了处理器速度是以千兆赫而不是兆赫为单位来谈论之外。并非每个独立应用程序都需要当今顶级处理器所提供的计算能力。因此,PC 市场已经分化成广泛的市场细分领域。从 400 美元的“经济型”PC 到 4,000 美元的“高性能”型号,总有一款适合所有人,而且一种尺寸当然不适合所有情况。
对于游戏开发者来说,曾经相对容易的游戏(请原谅双关语)——“为高端系统编写代码,你的游戏就会畅销”——已经变成一项艰巨的任务,即创建具有可扩展性的游戏。一款游戏必须能够在通常由发行商的最低系统要求决定的低端系统上运行,但又要以某种方式进行创新,以赢得评论家和早期购买者的赞誉,从而激发销量。创新的一种方式是利用新技术和性能,以增强视觉效果并实现以前无法实现的功能,从而为最终用户创造更好的游戏体验。
在本文中,我将探讨游戏开发者面临的这一挑战的几个方面。我首先更清楚地定义可扩展性,然后看看对问题影响最大的组件,再然后研究在游戏中解决可扩展性的方法。我还将讨论一些处理器趋势,并研究如何将它们应用于可扩展性挑战,以在未来改进 PC 游戏。由于我们离照片级真实感游戏还很遥远,因此可扩展性还有很大的机会,我们需要采取一些中间步骤才能达到目标。让我们来看看其中一些步骤可能是什么。
dictionary.com 将可扩展性定义为:“当问题规模增加时,某个问题的解决方案的工作效果如何。”1 当应用于多人联网游戏时,这个定义非常适合游戏开发者,在多人联网游戏中,并发用户数表示问题规模。然而,在游戏开发者中更常见的用法中,可扩展性指的是使一款游戏能够在系统配置(其功能、性能或两者都可能不同)中可接受地运行的挑战。挑战不仅限于处理器——甚至在多人游戏中也不仅限于单台计算机。尽管系统中的每个组件——芯片组、内存、硬盘驱动器、网络、声卡等等——都发挥着作用,但可扩展性挑战中最显著的两个部分通常是处理器和图形子系统。这两个部分通常高度互连。
图 1 和图 2 显示了两种最常见的配置,以及系统中各个组件的一些典型带宽。请注意,在带有附加显卡的配置(图 1)中,显卡有自己的内存,用于存储渲染所需的数据。在集成显卡配置(图 2)中,主系统内存由处理器上运行的应用程序以及图形渲染引擎共享。
为了利用最先进的图形硬件引入的功能,需要将高性能处理器与之耦合,以提供用于生成复杂视觉场景的数据。高端处理器可能能够以交互帧速率模拟复杂的物理系统,但如果无法以足够的视觉保真度快速渲染它们,则会使图形子系统成为链条中最薄弱的环节。此外,处理器和图形硬件的其他组合也很常见,游戏开发者必须设计出能够为每个最终用户的系统配置提供尽可能最佳体验的解决方案。必须做出权衡。在不疏远大量游戏玩家的情况下选择正确的权衡是可扩展性挑战的核心。让我们来看看这些权衡通常是如何发生的。
PC 游戏的开发周期可能从几个月到四年或更长时间不等,具体取决于项目的范围、目标受众和预算。对于为期四年的项目,开发开始时的高端系统很可能在游戏发布时成为低端系统,因此开发者通常可以从一开始就以该系统为目标。当然,随着新技术的出现,开发者必须利用其中的一些技术,否则他们将面临一款与两年开发时间线的游戏相比显得逊色的游戏,后者可以利用领先的技术。
无论开发时间框架如何,发行商通常都会施加最低系统要求,这些要求涵盖了三到五年前的高端系统。仅考虑处理器和图形硬件这两个关键组件,游戏开发者必须考虑多种配置。在频谱的一端是最低要求:旧处理器和旧图形硬件。在这种情况下,一切都可能被缩减到游戏正常运行所需的基本要素,但可能不会有任何超越去年游戏的功能。在频谱的另一端,那些刚刚购买了配备非常快速的处理器和高端图形硬件的新 PC 的人,会希望向他们的朋友展示他们的游戏在高级配置上运行得有多棒。
开发者解决各种配置的可扩展性的选项可以缩小到三种技术
1. 只创建一个游戏版本,该版本在满足最低系统要求的系统上以中等性能运行。拥有更高性能系统的人将获得更好的性能,但仅达到一定水平。在某个时候,性能的增量增加将无法衡量(例如,超过某个帧速率)。无论在哪个系统上玩游戏,功能集都将相同。
2. 创建两个或更多性能档次,这些档次可以通过分析系统性能动态选择,或者是由最终用户选择的可配置菜单项。通常,安装程序会确定性能级别并相应地配置游戏内选项。然后,游戏玩家可以选择更改这些选择,但会牺牲性能或质量。不影响游戏玩法的增强功能通常为顶层档次启用,为底层档次禁用。到目前为止,这是将可扩展性引入游戏中最常用的机制。
3. 使用更具可扩展性的技术,例如动态消除网格中的三角形,或无限可扩展的技术,例如 NURBS(非均匀有理 B 样条)或隐式曲面。与做出影响每帧性能的动态选择相关的挑战非常大,以至于开发者很少选择这样做。
由于技术 3 带来的不确定性以及技术 1 导致的高端差异化不足,大多数开发者选择通过创建技术 2 中描述的性能档次来创建可扩展性。通常,档次是两个要素的函数:主处理器的时钟速度和图形子系统的 API(应用程序编程接口)支持。不幸的是,这两个因素并不能同样好地涵盖所有可能的系统配置,并且往往会造成一种情况,即能够实现更高性能的系统(例如,具有高端处理器但集成显卡的系统)可能会被置于较低性能的档次中。相反,低端处理器与高端图形硬件耦合可能会启用图形硬件能够渲染的功能,但处理器无法足够快地提供数据以实现可接受的游戏玩法。
假设游戏将使用分档技术来实现可扩展性,现在让我们来看看一些可以帮助开发者应用该技术的处理器趋势。
每一代相继推向市场的处理器都增加了开发者可以利用的增强功能,以改进他们的游戏。最近的一个例子是超线程 (HT) 技术的引入,该技术使单个物理处理器在操作系统和应用程序看来像是两个处理器。流水线停顿限制了可以从单个指令流中提取多少指令级并行性。每当发生缓存未命中或分支预测错误时,就会发生停顿。HT 技术使两个执行线程能够更好地利用处理器的物理执行资源。例如,当一个线程遇到流水线停顿时,两个线程中的每一个都可以执行,或者一个线程可以使用整数执行单元,而另一个线程可以使用浮点单元。
HT 技术是通往具有多个物理内核的处理器的道路上的一块垫脚石。自 2002 年引入台式 PC 以来,每一代相继推出的处理器都将提高两个或多个并发线程可能实现的性能加速。为了使游戏能够继续突破界限,它们必须有多个执行线程在游戏循环的各个阶段工作。
处理器扩展以实现应用程序更高性能的另一种方式是通过新的指令集。示例包括 MMX(多媒体扩展)技术、SSE(流式 SIMD 扩展)和 SSE2。这些特定的指令提供了 SIMD(单指令、多数据)操作,可以处理各种大小的整数和浮点数据类型。通过使用此类指令并适当地排列数据以与指令一起工作,游戏可以在每个时钟周期内完成更多工作。我将在此处讨论的一些可扩展性技术可以通过利用新的指令集更容易地实现。未来的处理器将继续引入指令集扩展,这些扩展可用于增强某些算法的性能。例如,即将推出的英特尔代号为 Prescott 的处理器具有少量 SIMD 指令,可以帮助游戏开发者优化四元数计算等技术。
最近出现的第三个趋势是推动处理器和配套组件消耗更少功率以增强移动平台。尽管我不会在本文中进一步研究这一点,但开发多人游戏的开发者将需要考虑低功耗平台对其游戏的影响。特别是,有一些代码优化可以降低应用程序的功耗。这不是游戏开发者目前考虑的事情,但可能在不久的将来会成为现实。
考虑到这些趋势,让我们看一下典型的游戏循环,然后研究一下当今在游戏中应用可扩展性的一些领域。
图 3 显示了一个简化的典型游戏循环的一些关键要素。此示例显示了按顺序发生的操作,但某些任务可以并行执行。游戏循环的某些方面(例如,评分或处理声音)在此处未显示。
随着游戏不断发展和改进真实感,此处显示的游戏循环的所有阶段都必须共同增强。最薄弱的阶段始终是游戏玩家最容易注意到的阶段。如果视觉效果非常出色,但 AI(人工智能)没有多少“I”,那么游戏就不会真正有趣。或者,如果物理模拟比以前完成的任何工作都领先一步,但几乎不可能用键盘和鼠标来操作它,那么游戏玩家很快就会厌倦它,转而玩更有趣的东西。
将可扩展性应用于游戏循环的不同阶段需要不同的技术。对于几乎完全处理 DrawScene 阶段的图形子系统,可以通过根据可用的图形功能启用不同的渲染技术来解决可扩展性问题。对于物理模拟,可以应用不同的技术来解决不同类型的问题。让我们看看其中一些问题以及如何通过可扩展性来解决它们。
最初的 3D 游戏几乎完全基于室内环境,因为显示走廊所需的 3D 几何图形量远小于显示森林场景所需的几何图形量。随着 3D 加速器的改进,户外场景出现了,现在,大型多人游戏几乎都基于户外。不幸的是,由于树木的几何图形非常复杂(而且很大),游戏通常会重复使用每种树木中的几种。如果你在森林中奔跑,你经常会在不同的位置看到完全相同的树木一遍又一遍地出现。此外,游戏中的树木通常有多个细节级别 (LOD)——一个用于远处的树木,一个用于中等范围的树木,一个用于近距离的树木。增加树木多样性的技术必须适用于不同的 LOD。
使用一些参数来指示要制作的树木类型,可以程序化地生成一棵完整的树木。Weber 和 Penn2 描述的算法具有足够的灵活性来创建树林。但是生成的树木包含大量几何图形,目前无法快速生成以在运行时执行。但是,可以做的是生成树木的碎片(例如,树干和树枝),然后使用一种新算法在运行时以不同的方式组装它们。用于执行组装的例程可以放在另一个线程中,其输出可以指定要使用的树干和树枝碎片以及将它们组合在一起的变换矩阵。
可以通过多种方式引入此技术的可扩展性。首先,用于创建树干和树枝的三角形数量可以根据可用的处理器和图形硬件性能而变化。其次,树木组装例程可以放在低优先级线程中。当主线程需要一棵树时,它会从一个正在被低优先级线程填充的队列的顶部拉出一棵树。如果队列中没有树,那么主线程将再次使用前一棵树。通过这种方式,具有空闲周期的系统可以创建更多树木变体。
结合创建各种树木,可以通过动画树木的树叶和树枝来逐步增加游戏的真实感。一些游戏已经做到了一定程度。但是,通常运动是由艺术家预先计算的。使用刚刚描述的程序化生成的树木,开发者可以再次根据可用的处理器周期来动画这些部分。在低端系统上,树木将是静止的。在中级系统上,可以动画主树干以摇摆(使用 Weber 和 Penn2 描述的技术)。在高端系统上,甚至可以使用 Peterson3 描述的技术来动画树枝和树叶。
实现刚刚描述的想法应该很简单,但我们需要考虑以下几点
• 首先,在游戏中程序化地创建内容可能会引起游戏设计师的质疑。他们希望确保他们对游戏外观的愿景不会被一些随机将几何图形组合在一起的代码所破坏。为了确保这种情况不会发生,可能需要对程序化生成可以引入多少变化施加额外的约束,并且树木的某些部分可能仍然需要由艺术家创建。
• 其次,如果主游戏循环被设计为尽可能快地运行,那么创建树木的低优先级线程可能无法获得足够的 CPU 周期来发挥作用。提供一种方法来保证树木创建线程取得重大进展,同时保持主线程的足够性能将需要进行一些调整。
• 最后,保持不同 LOD 中程序化生成的树木之间的视觉一致性将需要一些实验;否则,LOD 之间的视觉“跳变”伪影可能会很严重。
游戏中另一个突出显示与现实脱节的领域是角色的服装。一些游戏,例如《杀手:代号 47》(IO Interactive,2000 年),已经实现了一些简单的技术来处理风衣和斗篷。但是游戏中的大多数角色看起来仍然像是他们的服装是永久的塑料附件。从我们今天拥有的水平到全面模拟服装是不可能一蹴而就的。然而,或许可以使用研究和电影领域的某些技术来逐步实现这一目标。
布料模拟是最近许多研究的主题。Baraff 和 Witkin4 为使用隐式积分来实现更稳定的布料模拟奠定了基础。最近,Choi 和 Ko5 解决了不稳定性问题的另一部分,Baraff、Witkin 和 Kass6 解决了布料与布料碰撞引入缠结的问题。然而,将这项研究应用于游戏中的布料模拟非常困难。
可以通过可扩展性应用的一种解决方案是首先用实际的几何图形替换游戏中角色身上的服装,这些几何图形将衣服与底层的角色模型分开。然后将使用一套重复的“不可见”几何图形来模拟服装的运动。重复的集合将根据游戏运行系统的性能被细分为不同的程度,并且实际的几何图形将根据重复版本中的相应运动进行移动。低端系统可能无法实现实际服装的任何运动。高端系统可能会细分到相当大的程度,然后模拟布料,将某些顶点视为“固定”顶点,这样最初就不必处理完全的布料与布料和布料与物体碰撞。随着处理器性能随时间的推移而提高,模拟可能会变得更加详细。无论模拟程度如何,将这些计算放入第二个线程将有助于今天的处理器以及未来的处理器。
对于布料的非服装用途,处理器性能已经达到了允许更多物理模拟的程度。船帆、商店遮阳篷或在风中飘扬的旗帜是环境效果的简单示例,这些效果可以提高游戏的真实感,不影响游戏玩法,并且可以增加或减少模拟的三角形数量以解决可扩展性问题。
实现布料模拟很困难——而且这里提到的所有研究都不是万能药。任何时候物理模拟控制了游戏的一部分,都可能出现测试中没有出现过的配置——并且有些东西看起来会非常糟糕。为了防止这种情况发生,布料模拟应确保时间步长永远不超过通过实验尽可能确定的最大值。然而,这的影响是,在布料模拟中花费的时间过多可能会拖慢主游戏引擎的速度。与任何可扩展的解决方案一样,实现应尝试尽快检测并防止或纠正这种情况。
流体动力学是一个广泛的领域,它最容易应用于游戏的烟雾、火焰和水域。由于求解描述流体运动的 Navier-Stokes 方程的复杂性,大多数游戏甚至没有尝试进行逼真的流体模拟。然而,Stam7,8 最近的研究引入了以视觉上可信的结果解决简单流体问题的可能性。通过改变模拟的网格大小,这些技术可以以可扩展的方式应用(假设结果只是环境效果)。这只是根据可用的处理器性能选择合适的网格大小的问题。当然,某些网格大小可能太小而无法使用,因此需要回退到不同的技术。
对于在船上发生动作的游戏,周围湖泊或海洋的水通常需要某种形式的动画才能显得逼真。在最简单的形式中,正弦波用于上下移动水的顶点。组合几个不同振幅和频率的波可以引入更多变化。然而,重复的模式通常仍然很明显。
一款正在开发中的游戏正在使用 Tessendorf9 描述的更高级的统计方法来模拟逼真的海水。低端系统使用正弦波技术,而高端系统使用 Tessendorf 技术。通过将更好的模拟与高端图形硬件上更精美的渲染相结合,游戏内结果非常令人印象深刻。
可扩展性在流体模拟中的应用也面临着挑战。与任何物理模拟一样,如果问题大小发生变化(例如,不同的网格大小)或者模拟时间之间的时间步长变化,最终结果将有所不同。因此,流体模拟的最初用途必须完全致力于环境游戏效果,或者足够简单以在最低系统规格上运行,而无需扩展到更高的系统。最有可能的是,将流体模拟引入实际游戏玩法(而不仅仅是环境效果)将需要两者的结合,因此视觉质量可能是可扩展的,但模拟质量将是固定的。
可扩展性是游戏开发者无法忽视的挑战。它不是他们将面临的唯一挑战,但它是一个可以显著影响游戏质量以及一款游戏相对于竞争对手的差异化的挑战。幸运的是,可以通过利用新的处理器功能并利用研究界正在进行的工作来解决可扩展性问题。
我们已经研究了消费级 PC 处理器的发展历程,并且看到线程对于从未来的平台获得最佳性能至关重要。游戏循环的几个阶段将需要在它们自己的线程中执行,才能从可用的性能中获益。此外,其他处理器扩展(例如新的指令集)将为开发者提供一种以可扩展的方式引入新技术的手段。利用这些处理器增强功能,游戏将继续成熟,并更接近我们在计算机图形生成的电影中看到的照片级真实感世界。
作为实现这一目标的一个步骤,我们已经研究了游戏中的几个领域,开发者可以通过使用基于处理器功能和扩展的可扩展技术来改进这些领域。所有三个研究领域——树木、布料和流体——都可以从线程和 SIMD 指令中受益。这三个只是可以使用处理器扩展可扩展性的游戏方面的几个方面。可以探索其他领域,这些领域将可扩展性应用于图形硬件以及处理器。通过将可扩展性应用于游戏循环的元素,开发者可以自由创新,同时创建可供庞大的消费级 PC 安装基础访问的游戏。
1. Dictionary.com:请参阅 http://dictionary.reference.com。
2. Weber, J., 和 Penn, J. 逼真树木的创建和渲染。 SIGGRAPH 会议记录 (1995), 119–128.
3. Peterson, S. 树木动画。硅谷 SIGGRAPH (2001); http://silicon-valley.siggraph.org/MeetingNotes/shrek/trees.pdf.
4. Baraff, D., 和 Witkin, A. 布料模拟中的大步进。 SIGGRAPH 会议记录 (1998 年 7 月), 43–54.
5. Choi, K.-J., 和 Ko, H.-S. 稳定但响应迅速的布料。 SIGGRAPH 会议记录 (2002 年 7 月), 604–611.
6. Baraff, D., Witkin, A., 和 Kass, M. 解开布料。 SIGGRAPH 会议记录 22, 3 (2003 年 7 月), 862–870.
7. Stam, J. 稳定的流体。 SIGGRAPH 会议记录 (1999), 121–128.
8. Stam, J. 游戏的实时流体动力学。游戏开发者大会会议记录 (2003 年 3 月).
9. Tessendorf, J. 模拟海水。 SIGGRAPH 课程笔记 (2001).
DEAN MACRI 是英特尔软件和解决方案部门的员工技术营销工程师。他主要与游戏开发者合作,帮助他们优化游戏以适应当前和未来的处理器架构,并利用可用的处理能力来启用新功能。他拥有圣文森特学院(宾夕法尼亚州)的数学和计算机科学学士学位,辅修物理学,以及宾夕法尼亚大学的计算机科学硕士学位。1992 年获得硕士学位后,他在一家 2D 图形动画公司花了五年时间开发高度优化的 C、C++ 和汇编语言例程。他于 1998 年加入英特尔,追求他对 3D 计算机图形的兴趣。
最初发表于 Queue 第 1 卷,第 10 期—
在 数字图书馆 中评论本文
Walker White, Christoph Koch, Johannes Gehrke, Alan Demers - 更好的脚本,更好的游戏
2007 年,视频游戏行业收入达到 88.5 亿美元,几乎与电影票房收入相当。其中大部分收入来自大型团队创作的重磅游戏。尽管大型开发团队在软件行业中并不鲜见,但游戏工作室往往拥有独特的开发者群体。软件工程师在游戏开发团队中占比较小,而团队的大部分由内容创作者组成,例如艺术家、音乐家和设计师。
Jim Waldo - 游戏和虚拟世界中的扩展
我曾经是一名系统程序员,从事银行、电信公司和其他工程师使用的基础设施工作。我从事操作系统方面的工作。我从事分布式中间件方面的工作。我从事编程语言方面的工作。我编写工具。我做了硬核系统程序员所做的所有事情。
Mark Callow, Paul Beardow, David Brittain - 大型游戏,小型屏幕
在创建和分发移动 3D 游戏时,立即显而易见的一件事是,手机市场与更传统的游戏市场(例如游戏机和掌上游戏设备)之间存在根本差异。其中最引人注目的是交付平台的数量;设备的严重限制,包括可以更改方向的小屏幕;有限的输入控件;需要处理其他任务;非物理交付机制;以及手机性能和输入能力的变化。
Nick Porcino - 游戏图形:革命之路
从瓷砖块背景上的彩色精灵到现代游戏中身临其境的 3D 环境,这已经是一段漫长的旅程。过去是单个游戏创作者的工作,现在已成为一项多方面的制作,涉及来自各个创意学科的工作人员。下一代游戏机和家用电脑硬件将带来可用计算能力的革命性飞跃;商品硬件将提供每秒万亿次浮点运算 (teraflop) 或更多。