搜索 Unity

Unity专家教你如何优化主机游戏画面

2021年11月3日 类别 技术 | 12 分 阅读
FPS Sample Screenshot
FPS Sample Screenshot
分享

经常阅读Unity博客的开发者们一定注意到了我们最近的优化系列文章。我们会在文中分享许多优化移动游戏的好建议,主题涵盖图形和资源性能分析、内存优化、代码架构以及物理模拟、UI和音频

而今天我们又带来了更多关于优化游戏主机高端图形的技巧。在这里了解怎样减少批处理次数、哪些着色器不太好用、各个渲染选项的作用等等。本文中总结的技巧摘自我们介绍PC和主机游戏高级优化技术的新电子书,完整的电子书可在此处免费下载

游戏主机图形优化

为Xbox和PlayStation开发游戏类似于PC,但主机平台也存在有独特的开发挑战。譬如,要想在主机上生成流畅的帧率,你通常需要在GPU优化上下足功夫。

Forest

找出性能瓶颈

首先,我们需要先找出一个占用大量GPU资源的帧。你可以使用微软和索尼自带的工具来分析项目在CPU和GPU上的耗能情况,也可以使用主机平台必备的PIX for Xbox和Razor for PlayStation 分析工具进行分析。 

使用这些分析器将每一帧的性能消耗拆分成更具体的小步骤,据此进行图形性能的优化。

减少批处理次数

主机上的优化类似于其他平台,不外乎减少绘制调用批处理的次数。你可以试着使用这些技巧。

  • 使用Occlusion Culling(遮挡剔除)删去被前景物体遮挡的物体,避免出现过度绘制。注意,遮挡剔除需要由CPU进行额外的运算,请在分析器中权衡将GPU负荷转移到CPU上的利弊。 
  • 若许多对象有着相同的模型网格和材质,GPU实例化也可以降低批处理次数。通过精心地布置场景,你即可以减少模型数量、提高性能,又能让场景不显得千篇一律。

SRP Batcher可以通过批处理Bind和Draw GPU指令来简化DrawCalls间的GPU准备工作。SRP批处理在材质数量较多、应用的着色器较少(如URP和HDRP中的Lit和Unlit Shaders)时最能发挥自己的作用。

启用Graphic Job

你可以在Player Settings > Other Settings中启用Graphic Job,来利用起PlayStation或Xbox的多核处理器。Graphics Jobs (Experimental)允许Unity将渲染工作分散到多个CPU核心,减轻渲染线程的压力。详细原理请见教程Multithreaded Rendering and Graphics Jobs

后处理分析

后处理效果是游戏主机优化不可忽视的一环。资源商店上有许多后处理分析工具都是为PC编写的,在Xbox或PlayStation上会消耗更多的资源。请使用原生分析器来分析主机上的后处理效果。

避免使用表面细分(Tessellation)着色器

表面细分是指将大块形状细分为小块,用更多的面数来增强细节。尽管有时候使用表面细分的确有必要(如《 死者之书》里高度逼真的树皮),但由于此效果会占用大量的GPU资源,游戏主机由于性能有限,不宜使用表面细分。

用计算着色器(Compute Shader)取代几何着色器

类似表面细分着色器,几何和顶点着色器每帧会在GPU上运行两次,一次深度预处理通道,一次阴影通道。

如果你想在GPU上生成或修改顶点数据,计算着色器往往要比几何着色器更适合。在计算着色器中处理顶点数据可让顶点着色器的模型渲染相对更快、更简单。

优化绘制命令的波面占用率

一次绘制调用在发送至GPU时,会被拆分成很多信号波面(相位),由Unity将信号分配给GPU上的SIMD,

而每个SIMD都有一个最大的并行波面数。波面占用率指当前信号波面相对于最大值的占用率,它可用于衡量GPU算力的使用程度。PIX和Razor可以非常详细地展示每次绘制调用的波面占用情况。

Wavefront occupancy
波面占用好坏对比

在上方《死者之书》的例子中,顶点着色器的波面显示为绿色,像素着色器的波面显示为蓝色。在底部图表中,顶点着色器的信号占了绝大多数,但像素着色器的信号却非常少,这表示GPU的潜力没有得到充分的发挥。

仅仅处理顶点着色器而不生成像素表明渲染效率比较低下。虽然低波面占用率不一定是坏事,但它也是优化着色器、检查渲染瓶颈的起点和指标。如果项目因为内存过少或运算过慢而出现卡顿、死机,提高GPU绘制命令的波面占用率可能会提高性能。另一方面,处理中的信号波面过多也可能导致缓存不稳(Cache Thrashing)、降低性能。

HDRP内置与自定义渲染通道

HDRP项目可利用内置和自定义的渲染通道来辅助场景的渲染。内置渲染通道可以有效优化着色器,而HDRP还支持在预设的几个插入点向着色器添加自定义的渲染通道。

Use HDRP injection points to customize the pipeline.
在HDRP插入点定制管线。

关于透明材质渲染的优化请参考手册的Renderer and Material Priority一节。 

减小阴影贴图渲染目标

High Quality(高质量)设置下的HDRP默认使用4K阴影贴图,你可以试着降低阴影贴图的分辨率来检测其对单帧耗能的影响。注意,低分辨率阴影贴图对图像质量影响可能需要用光照进行补偿。 

使用异步计算(Async Compute)

如果GPU存在一定的低占用率时段,你可以使用异步计算法将部分计算着色器的作业转移到并行的图形运算队列中,从而更好地利用GPU资源。 

举例来说,GPU在生成阴影贴图时只会执行深度(Depth-only)渲染。这时,GPU会执行极少的像素着色器运算,有大量的波面处于空闲状态。

Async Compute can move compute shader work in parallel to the graphics queue
而异步计算可将计算着色器的作业转移到并行的图形运算队列中,

如果你能同步进行计算着色器的运算与深度渲染,就能更好地利用起GPU资源。空闲中的波面可用于运算屏幕空间环境遮蔽(SSAO),或用于补充其它运算任务。

Optimized render at 30 fps
优化后的30帧渲染

在这个《死者之书》的例子中 ,几种图形优化将阴影贴图、光照通道和氛围渲染的处理时间缩短了几毫秒,优化后的单帧耗能让应用能在PS4 Pro上以30帧运行。

Optimizing Performance for High-End Consoles性能案例研究中,Unity图形开发Rob Thompson讨论了将《死者之书》移植到PlayStation 4的过程。你也可以阅读10 Tips for Optimizing Console Game Graphics来了解更多详情。

下载完整的性能优化指南

如果你想获取所有的提示与技巧,可以在我们团队出版的92页电子书中学习更多可操作性强的知识点。 

下载电子书

若想详细了解Unity的Integrated Support服务,或希望直接联系Unity工程师,为你的项目寻求专家建议和最佳实践指导,请点击此处了解Unity的Success Plans。

没看到想要的内容?

我们希望帮助广大开发者在自己的Unity应用中发挥出引擎的所有潜力。如果你有任何想要了解的优化主题,请留言告诉我们。

 

2021年11月3日 类别 技术 | 12 分 阅读