优化

Video Game Optimization——主机

主机和电脑不同,更加面向游戏。

了解你的主机

如何确定你的主机性能特性:

  • 底层硬件访问:在NES上你需要直接访问光栅化芯片。在360你需要直接访问GPU操作的内部数据。当你需要支持很多的平台供应商时是非常必要的。
  • 快速总线:主机内存传输率往往远超PC。所以你如果有硬件限制,那么最大化你传输的数据量。
  • 快速内存:内存是昂贵的,当你只运行一个应用,大量的内存并不是最好的。主机倾向于更小的快速内存,这样就可以充分利用它们。
  • 定制硬件:主机一般都有特殊硬件,比如NES的卡带,PS3的处理单元,XBox的扩展指令集。如果没有定制硬件,主机就不是主机。
  • 同质性:每一个主机都有一致的能力和硬件。你不需要担心同事支持10种驱动版本或者八种不同的显卡提供商。
  • 质量保证:主机能保证上面的硬件的性能以及质量

这些特性让主机开发变得独特。如果了解PC开发一般主机开发也不会花太多时间。

保持基础强健

首先,在开始所有的优化之前仔细profile。对于每个PC上的性能hack,主机上有10个或更多,首先关注最大的问题点。

然后关注主机相关文档,主机会提供有用的feature用于提高性能。不过也要注意文档可能过时,导致解决方案无法在你的工程中使用。

最终着眼于工程的目标,早期制定budget,包括游戏上下文所需的以及主机供应商所需的。保证自己持续在其之上工作。

将其推到极限

当你进行主机开发的时候你可以推进到性能的极限。虽然有一些限制但是比在PC上面开发要更宽松。你可以依赖百分百主机的功能而不需要为最低性能的用户付出代价。

因为你有低层级的访问权限,所以你可以有一些PC上做不了的操作。主机上面也做了各种专为游戏做的特性,比如在磁盘上保持内存图片,并且通过单个IO请求来加载并指向他们。或者在声音控制器放重要逻辑位,或者使用备用空间来获取一些额外的内存。

这也许是PC和主机开发之间最大的区别。通过使所有东西可访问,可以实现更强大的功能系统。这需要更多的能力去压榨固定平台的性能。

搜索并且使用你能使用的任何东西。

裁剪

主机给你硬件的低层级访问。作为副作用,他们也有限制的操作系统的驱动API,他们相对于用户端产品被大幅度裁剪了。很多feature被直接移除,另外feature被简化,用于专注游戏性能。

每一个用户端系统都跑了一个复杂的操作系统,保护应用程序、硬件以及用户。软件可能会被写得很糟糕或者恶意软件,导致需要大量的错误检查。即使完成度比较高的软件也需要共享资源、添加抽象层或者间接层。

在早期的主机,是没有操作系统的,比如NES,直接通过执行代码启动,而没有任何中间层。因为只有任天堂可以制造储存游戏的插卡,在物理层面就拒绝了不信任的代码。因为硬件层没有跨重置保护状态,所以游戏难以防止位置的操作导致储存损坏。

在现代主机,有大量的复杂的软件给用户舒适的体验。操作系统在游戏下层提供有用的服务。硬盘也是很大的考虑,游戏可以从网络下载。光盘制作自己的游戏有点困难,但是光板烧录器很便宜,所以操作系统经常需要验证游戏是否被信任并且允许执行。

然而不像桌面软件,主机基本只跑一个应用,也就是你的游戏,使用最大的性能。一般这意味着外部系统服务会被移除,游戏使用上升的特群运行也就有更少的安全上下文被请求。所有的调度都为你的游戏服务。

虚拟内存经常是第一个处理的地方。因为可以解决多任务在有限内存中的问题,在单应用程序系统,类似于主机,额外的复杂度让它拥有了非常缓慢的失败模式。对于游戏来说能更好地监控自身的内存使用并且把它们状态物理内存里面。

通常有很多类似功能的API,主机制造商只会选择一种,经常是最底层的,并丢弃其他。并且在只有最常用的API才会被支持,不常用或者没意义的API会被丢弃。

为了迎合安全性或者特性考虑,主机API也许会添加得很复杂。比如网络访问会非常严格限制,所有可能会有强制的握手步骤。音频也许需要多种输出场景。所以基本就是用最饱满的格式然后向下转换。数据访问会收到提供商的验证,防止用户修改数据的风险。或者完全移除访问,而只使用特定的API来进行单独的处理。

发生在后台的功能更接近于主机。比如固定数量内存和限制的处理数,栈管理不一定在操作系统,你可以有完全的自由度来操作内存。操作系统和用户代码的界限开始模糊。有些主机在操作系统同样的核心里面运行游戏代码,大大减少了上下文切换的消耗。

一些图形驱动的代码会直接编译到你的程序里面,这样你就可以在瓶颈的时候直接调试相关代码,比较并等待供应商下次的驱动升级。

这些导致主机开发学习起来很困难。关注快速的API关注快速的游戏。有时候你必须放弃一些好用的东西,但是对于稳定性和性能来说是好的trade-off。

中间件

The Dip :在事情发生更好之前,可能会变得更糟糕。在着手处理之前你要了解这个Dip有多深,在事情变得更好之前是否有办法到达那个转折点。

在获得主机的优势前可能需要大量的研究和开发。你在着手实现一个视频编码、物理库或者音频引擎或者其他复杂的功能组件的时候,这就是你的Dip。如果你有18个月来发布你的游戏,你能花十二个月来写一个优化过的角色动画系统吗。能写出来的话当然是最好的,但是如果你花了更长时间或者比你想象中更加复杂,你的游戏就真的陷入困境了,你会失去大量的时间来写gameplay和图形。

今天的主机非常复杂。Sony并不期待人们可以完全利用PS3这些年的优势,尽管它已经发售了一段时间了。在PS2生命周期快结束的时候发售的游戏已经基本认不出是跑在刚PS2发售时候的硬件了。

一般来说如果你有预算,使用中间件是个好的选择,特别是在主机上,平凡的实现和一个好的实现差距是巨大的。当然你需要做好调查。

事实上,好的中间件非常重要,需要主机提供商会开发中间件和库作为开发套件的一部分赠送。比如360主机上使用D3DX库足够实现一个基本的游戏。但是不会处理比如Havok解决的问题。

越来越多的中间件使用开源证书,比如Bullet是一个很好的物理库,拥有内核优化对于Cell和其他特殊的主机特性。它深圳得到了Sony研究者的开发时间。

你可能不想把你的游戏开发预算花在第三方软件上,但是一些策略性的投资可以让你节省多个月的开发时间调试时间和优化工作。

额外支持

一个主机开发的优势是,相比较于PC开发。主机制造商非常希望你能够成功,因为这样就可以从你的游戏拷贝销售额中获得提成。相比PC销售商和游戏开发商则关系没这么紧密。

一般来说一定的支持包含在了开发合同当中。主机开发商非常关注于系统内核代码bug的修复。基于这两个原因,你开发的游戏已经遥遥领先于开发OSX的游戏。

显然最终开发游戏的还是你自己,但是看一些讲座读一些库的文档会有很大的帮助,这些潜在在你的邮件列表和论坛,能够被在你的平台上的主机开发者收到。

了解约定

主机是关于稳定可靠的游戏体验。如果有10个NES,每一个性能都不一样,那么任天堂则不会有今天的家用主机的成绩。一个开发主机游戏的前提就是确认主机的标准。

当你签订了主机提供商的合约,公司会指定特定的技术要求来保证你的游戏可以跑在主机上。这个可以是最小帧率范围,到网络使用限制,颜色以及UI表现等等。这些度需要有QA的保证,在主机上面是被测试过的并且可以正常运行的,并且满足性能的要求。

保证你完全了解的约定之后,你可以来预算你的时间,然后处理资源来迎合。有时候他们是繁重的,但是这对于发布一个优秀的产品十分重要。对于优化视角,约定要表现到你的性能预算上来。

内存和总线

主机资源有限,但是资源很快。特别是内存和总线速度非常快,容量很大。这就导致一些优化策略的可能性。

举个例子,对于用户端程序,读取虚拟内存是很慢的。因为主机有很快的内存读取,这样就可以使用一些对于其他场景很耗的方案,例如重度的贴图流,频繁的回读framebuffer。我们会在GPU的部分讨论。

主机经常涉及内存等级,这导致了一些程序的工作可以导致巨大的性能提升。举个例子,PS3使用Cell架构,每个Cell都拥有一个小的本地chip,非常快速的内存。涉及一个使用本地内存的算法会大大提高计算效率。类似的360包含了少量的高速渲染内存,和普通的虚拟内存单独分开。

http://en.wikipedia.org/wiki/Xenos_(graphics_chip)

主机GPU很夸张

GPU拥有所有有趣的底层特性,但是他们不能通过上层API暴露。因为他们不能脱离显卡甚至是API单独工作。大部分的主机GPU让你可以直接操作显存,包括GPU内部的结构用于渲染。这可以带来巨大的时间节约,因为你可以直接从磁盘读入显存,直接使用用于渲染的格式。你可以直接做相关的操作而不需要转换。

主机内部内存也想当快。在PC上一个图形卡可能需要通过不同的总线。因为不同的应用都要使用显卡,所以性能受到外部控制的影响。

在主机上面,你知道到底有多少的带宽你可以用于传输,而且全世界的同款主机都一样。在PS2上回读framebuffer然后做延迟渲染在CPu是可能的。这对于有限制GPU的主机上会是非常有用的。

更多最近的主机有更好的Gpu能力,降低了这种技术的必要性,但是在一些主机上依旧是非常可行的(http://research.scea.com/ps3_deferred_shading.pdf)。

像SVT这样的算法或者tonemap之类涉及到回读framebuffer的,快速总线导致大幅的性能提升。

主机的GPU经常开发一些有趣的接口,例如自定义贴图格式,或者定制shader指令,找到这些并且利用它们。

推进算法

对于消费端硬件你没有办法假设太特定的机器特性。假设固定的cache尺寸或者特殊的时间是不明智的。花费大量的时间来对单一的CPU和GPU优化是浪费时间的,因为实际硬件并不一致。

但是在主机平台,硬件是固定的,所以你可以针对这一特定硬件做特殊的优化。虽然可能会上几个不一样的主机,但是这个是可控制的,而且明显的变化一般会在计划中并且做好文档。

固定输出,调校数据

主机原本是用于CRT电视,运行固定的分辨率。在HD的到来,这变得更加多变,现在的目标分辨率有更多的选项。主机一般针对固定分辨率。

供应商会需求一个最小的帧率,这两个参数会帮助你限制资源来模拟和渲染。你可以做大量的处理来保持贴图尺寸的合理性。

在游戏完成的末期,你可以做限制资源的用量。在主机平台,没有多变的系统,所以你可以精确地预算你的资源然后使用所有你可以用的东西。

特殊的工具

主机有自己独特的世界,所以他们也有自己的工具。大部分的主机工具需要特定的主机硬件环境,作为开发套件的一部分来更容易开发、调试和测量。

因为硬件在主机上对开发者更加开放,所以profile能力也会更加强大,相比PC上的工具。PIX原本是提供给360的,并且相比桌面平台有更丰富的功能。虽然大部分的主机没有PIX这么好的开发体验,但是也脑韩了用于分析和调试渲染的实用工具。

主机的编译器是定制的,在底层它们可能是GCC的一个构建版本包含了一些内建函数和硬件特性。在上层,微软为360开发了全新的编译器,而有多个提供商为PS3维护了编译器。

许多这些前沿开发成果又回到了 PC 领域,但绝对值得您花时间查看一下您的控制台上可用的工具。

总结

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注