搜索Unity

控制台开发人员在一个场景可进行10种图形优化

上次更新时间:2019年1月

本页内容简介:控制台图形优化技巧,由Unity的Rob Thompson、控制台图形开发人员(他在Unite上讲解)和我们的演示团队提供。这些优化针对性能优化特别困难的场景,以确保30fps的平滑性能。

使用Unity的可编程渲染管线实现AAA质量

死者之书(本文中称之为BOTD)由Unity的演示团队制作。它是一部实时渲染的动画短片,本质上是用于测试,展示新型(还在试验)可编程渲染管线(SRP)的功能。SRP可用于以C#对渲染循环的核心编码,从而提供更大的灵活性,让您自定义如何描绘场景,使之适合您的内容。

控制台可编程渲染管线

可使用两个SRP:高分辨率渲染管线 (HDRP),提供现代AAA质量、高保真渲染器的所有功能,而轻量级渲染器管线 (LWRP)在针对移动平台缩放时会保持响应迅速的性能。BOTD使用HDRP,您在本文末可以找到SRP的高级学习资源。

用于BOTD的所有资源和所有脚本代码在Asset Store在Asset Store中

主要优化通道以在控制台达到1080p at 30fps(或更好)

演示的目标是提供交互体验,用户可以在环境中随意走动,用手触摸,从传统AAA游戏的熟悉角度进行体验。特别是,我们想展示在Xbox One和PS4上运行的BOTD。我们的性能要求是1080p at 30fps或更佳。

因为它只是一个演示,不是完全版的游戏,因此优化的重点是渲染。

一般来说,BOTD的性能相当一致,因为它没有任何这样的场景:有数千个粒子突然涌现出来,或者出现大量的动画角色。

首先,Rob和Demo团队发现了性能最差的视图,即GPU负载,其截屏如下:

控制台可编程渲染管线

场景中发生的一切都是固定不变的;变化的是摄像机视图中的内容。如果能够改善此场景,整个演示的性能都会提高。

此场景性能差的原因在于,它是进入中心的关卡的外部视图,所以场景的绝大多数资源都在摄像机视锥体中,结果导致大量的绘制调用。

简言之,此场景的渲染方式如下:

  • 使用HDRP
  • 美术师创作的纹理贴图大小大多数在1K与2K之间,极少数为4K。
  • 它对间接光照使用烘焙遮挡和烘焙GI,并且对太阳的直射使用单一动态阴影投射光源。
  • 在任何点都会发出几千个绘制调用(绘制调用和计算着色器分发)
  • 在优化通道开始时,视图在PS4 Pro上大约45毫秒时为GPU密集型。
GPU帧在优化通道之前显示什么

在优化通道开始时,Rob和团队逐步查看了GPU帧,看到了以下性能:

  • Gbuffer在11ms处(可以在Unity首席图形开发人员Sebastien Lagarde的可以找到中找到用于HDRP的Gbuffer布局描述)
  • 运动矢量和屏幕空间环境光遮挡的速度非常快,分别达到 .25 和 .6ms
  • 来自定向阴影投射的阴影贴图在使用动态光照时速度达到惊人的13.9ms
  • 延迟光照的速度为4.9ms
  • 大气散射速度为6.6ms

其GPU帧自始至终的外观如下:

控制台GPU帧

如您所见,它们的速度为45毫秒,两条垂直的橙色线显示,它们必须分别达到30fps和60fps。

对《死者之书》优化渲染的10种方式

控制批量计数

对于演示团队来说,CPU性能不是大问题,因为BOTD只是演示,还不是游戏,因此不像完整游戏那样,必须编写支持所有系统的复杂脚本代码。主要问题还是优化渲染工作。

但是,对于任何平台,保持较少的批处理仍然有价值。演示团队通过使用遮挡剔除实现此目的,主要是GPU实例化来优化渲染。。尽量不要在控制台上使用动态批处理,除非您确定它能提供更好的性能。

在本例中,GPU实例化是最实用的方法。不使用GPU实例化时,这一场景将有4500个批处理,使用后会减少至1832个。

另一个要点:用于创建此场景的资源实际上很少。利用优质资源并智能布置,团队创建了看不到重复的复杂场景,同时使用GPU实例化减少批处理数。

这是没有实例化的场景。

控制台可编程渲染管线

这是实例化的场景:

控制台可编程渲染管线

使用控制台上可用的多个核心

Xbox One和PS4是多核心设备,而为了获得最佳CPU性能,我们需要努力使这些核心始终保持忙碌。

如果您关注Unity的新闻,就会知道Unity正在开发一种高性能的多线程系统,它可让您的游戏在当前及未来充分利用多核处理器。简单来说,该系统包含三个子系统:实体组件系统C#作业系统Burst编译器

这个新的多线程系统还处于早期的试验模式。在Unity的图形系统中,您可以通过Graphics Jobs模式(同时也是试验模式)进行试用。在Player Settings > Other Settings下可以找到Graphics Jobs模式。

控制台图形作业

Graphics Jobs模式在几乎所有情况下都会在控制台上优化性能,除非您只是如实绘制了少量批处理。有两种类型可用:

  • 旧版作业,在PS4和DirectX 11 for Xbox One上可用
    • 将工作分发到其他核心,以减轻主线程的压力。请注意,在很大型的场景中,Unity用于与平台所有者图形API通信的“渲染线程”中可能存在瓶颈。
  • 本机作业,在PS4以及Xbox One的DirectX 12上可用
    • 对于大型场景,将大多数工作分发到可用的核心是最佳选择。
    • 从2018.2往前应该都是最佳选择(在2018.1或更早版本中,主线程可能承担更多的工作,因此性能退化)。

使用平台所有者的性能分析工具

Microsoft和Sony提供卓越的工具,用来分析项目在CPU和GPU上的性能。如果您在游戏主机上创作,可以免费使用这些工具。请尽早学习它们,并在整个开发周期中使用。Pix for Xbox One是Microsoft的工具,Razor Suite是Sony的工具;正如Rob所说,在这些平台上优化时,它们是您的主要工具。

配置后期处理效果

Rob说,他在PS4上配置了Unity游戏,开发人员不知道后期处理占用了多达⅔的帧数。原因通常是从Asset Store下载主要为PC创建的后期处理资源所致。它们在控制台上似乎运行良好,但实际上,性能特性非常糟糕。

因此,在应用这些效果时,时,需配置它们使用GPU多久,并进行迭代,直至在视频质量与性能之间找到满意的平衡。然后就不用管它们了,因为它们在每个场景中都会包含静态成本,也就是说,您知道剩下多少GPU带宽可用。

避免使用曲面细分(除非有很好的理由)

一般来说,不建议在控制台游戏图形中使用曲面细分。大多数情况下,在GPU上使用美术师创建的同等资源,比运行时曲面细分它们更好。

如果是BOTD,就有充分的理由使用曲面细分,那就是渲染树皮。

控制台曲面细分

曲面细分的位移可让他们在几何形状中加入深窝和粗糙细节,以普通贴图无法实现的方式正确地形成自身阴影。

因为树在BOTD中多为“英雄”对象,所以应该存在。在LOD 0和LOD 1中使用相同的网格完成。它们之间的差异只在于曲面细分的位移已相应缩减,因此在LOD 1时不再有效。

在GPU中始终保持健康波前占用率的目的

波前占用率这个词有点绕口,但了解它非常有价值。

您可以将一个波前视为一个GPU工作包。向GPU提交绘制调用或者计算着色器分发时,该工作则拆分为许多波前,并且这些波前在GPU上可用的所有计算机单元内所有SIMD中分发。

控制台波前占用率

每个SIMD都有可在任一时间运行的最大波前数,因此任一时间在GPU上并行运行的波前总数都有上限。我们使用的波前数被称为波前占用率,它对于了解GPU并行性潜力的使用效果是一个非常有用的指标。

Pix和Razor能够非常详细地显示波前占用率。上面的图表来自Pix for Xbox One。左边是一个波前占用率良好的示例。底部的绿色条表示有一些顶点着色器波前在运行,其上方的蓝色条表示有一些像素着色器波前在运行。

从右边可以看出存在性能问题。它显示有很多顶点着色器工作,但并未产生很多像素着色器活动。这说明GPU的潜力利用不足。由此引入下一个优化技巧。

为什么会出现这样的情况?当我们的顶点着色器工作不产生像素时,通常就会出现这种情况。

利用深度预传递

在Pix和Razor上更进一步的分析表明,团队在Gbuffer传递期间获得了大量的过度绘制。在控制台上查看Alpha测试对象时,情况尤其糟糕。

在控制台上,如果发出像素丢弃指令或直接写入像素着色器中的深度,您便无法利用早期深度拒绝。即使工作最终被否决,这些像素着色器波前也会运行。

这里的解决方案是添加深度预传递。深度预传递需要使用很淡的着色器提前将场景渲染至深度,在获得更重的Gbuffer着色器密集型时可作为更智能深度拒绝的基础。

HDRP现在包括深度预传递,可用于所有Alpha测试的对象,但您可以根据需要打开完全深度预传递。用于控制HDRP的设置、使用的渲染通道以及启用的功能,都可通过以下位置提供:

如果在HDRP项目中搜索HD渲染器管线资源,您会找到很多复选框,用于控制HDRP的一切行为。

对于BOTD,使用深度预传递对GPU非常有益,但要记住,它也有开销,需向CPU添加更多要绘制的批处理。

减小阴影贴图渲染目标

如前所述,此场景中的阴影贴图根据单一阴影投射定向光源而生成。使用了四个阴影贴图拆分,它们最初以32位深度渲染至4K阴影贴图,因为这是HDRP项目的默认值。在渲染到阴影贴图时,阴影贴图的分辨率几乎始终是这里的限制因素;Pix和Razor中的分析佐证了这一点。

减小阴影贴图的分辨率是明显的解决方案,即使这样可能会影响质量。

阴影贴图分辨率已降至3K,适当地权衡了性能。演示团队还特别添加了一个选项,允许开发人员渲染至16位深度阴影贴图。如果想自己试一下,请下载项目资源。

最后,更改阴影贴图的分辨率后,还必须更改光源的某些设置。

减小阴影大小

此时,团队已经修改了阴影贴图,重新定位了阴影贴图摄像机,以最佳利用目前减小后的新分辨率。那么,他们下一步做什么?

在关卡加载时只绘制一次最近(缩小最多)的阴影贴图拆分

因为阴影贴图摄像机没有移动太多,所以他们可能成功。缩小最多的拆分通常用于渲染距离玩家摄像机最远的阴影。

他们没有看到质量有下降。这表明是一次非常巧妙的优化,因为既节省了GPU帧率时间,又减少了CPU上的批处理数量。

经过这一系列优化后,阴影贴图创建阶段从13ms降到8ms以下;光照传递从4.9ms降到4.4ms,大气传递从6.6ms降到4.2ms。

这是团队在阴影贴图优化结束时所处的位置。他们现在处于可在PS4 Pro上以30fps运行的范围内。

控制台GPU帧

采用异步计算

异步计算是一种方法,可通过实用的的时间段工作最大程度缩短GPU上利用不足。目前只有PS4上支持,但DX12 for Xbox One很快就会支持。通过Unity的命令缓冲区界面可以访问。它不是专用于SRP,而是主要用于SRP。代码示例请参阅BOTD资源或HDR PSOS。

仅深度阶段是您使用阴影贴图的阶段,传统上是不能完全利用GPU潜力的点。异步计算可让您移动计算着色器工作以与图形队列并行运行,从而利用图形队列利用不足的资源。

BOTD将异步计算用于属于延迟光照一部分的平铺光源列表收集,所有这些主要是使用控制台上的计算着色器在HDRP中完成。它还将其用于SSAO计算。这两种用法都会与阴影贴图渲染重叠,以填充波前利用中的间隙。

要全面了解采用异步计算的一些概念性代码,请观看35:30处Rob的(从35:30开始)。

更多资源

您喜欢本文吗?请告诉我们!

喜欢。继续发送 还行。有待改进
明白了

我们使用Cookie来确保在我们的网站上为您提供最佳体验。有关更多信息,请访问我们的Cookie政策页面