进行移动端Unity开发,针对引擎PowerVR性能建议

电子说

1.3w人已加入

描述

如果你正在进行移动端Unity开发,那么这篇博客你绝对不能错过!最近,我们为广大用户提供了面向虚幻4游戏引擎的PowerVR性能建议,如果你更多时候使用的是Unity游戏引擎,那么我们现在就将与你分享PowerVR性能建议文档中关于提升Unity性能的一些方法。

大部分优化操作都适用于移动平台,但是也有一些是专门面向PowerVR平台的。也就是说,无论你的目标应用平台是什么,几乎所有的情况下都能够带来性能的提升,采用这些建议通常是很好的做法。

编译设置

纹理压缩

首先一定要确保使用了纹理压缩,这不仅能压缩存储空间,同时也会节省运行时的带宽,这是提升性能且节约电池寿命最好的方法之一。纹理压缩的优点是它们会一直处于压缩状态直到它们要被用于某个片段处理操作的时候。

Unity支持各种各样的纹理压缩方法,默认方法是ETC,当然你也可以选择其他方法,如下图所示:

powervr

压缩格式选项介绍如下:

  • ETC作为一种纹理压缩格式支持所有的设备,但是在压缩质量和大小方面被ETC2所取代,尽管ETC很简单并且有广泛的支持,但是它不支持阿尔法(Alpha)通道而且压缩率也不是很理想。

  • PVRTC这种纹理压缩格式仅支持PowerVR硬件平台,支持Alpha通道,具有最好的压缩比率和压缩质量,通过高度灵活的配置一定能够满足质量/大小的要求。

  • ASTC是一个开源的压缩格式,支持大部分平台,它支持Alpha通道,具有与PVRTC相似的压缩率和可配置性。

  • DXT作为一种压缩格式广泛的被桌面应用所支持,在移动领域由于授权问题,目前只有Nvidia Tegra平台支持

  • ATC则只有高通Adreno平台支持

尽管纹理格式设置是全局的,但是每一帧的纹理压缩质量都可以调节,如下图所示:

powervr

质量设置

最普遍的优化方法之一就是降低每个像素点的光数量,允许的光数量将直接影响GPU的负载,因为场景内的每个对象都需要在不同的光情况下进行渲染。这意味着每个网格都需要通过一个光照,在像素光数量选项设置中光数量的最大值将影响网格的效果。如果影响网格的光数量超过了上限,那么只有最重要的光将会被用于渲染每个网格,如果光线是均匀分布的且不重叠,那么在任何给定的时间内你都可以增加有效的光数量。

如何改变每个像素允许的光数量如下图所示:

powervr

确保阴影地图分辨率是“刚刚好”,使用最低的设置仍然看起来效果会很好,如果阴影地图分辨率太高,这不仅会浪费内存和带宽而且也会影响缓存的效率。

powervr

如下图所示阴影分辨率也可以根据每个光来设置,各自的光阴影分辨率总是优先于全局的质量设置,除非选择使用“Use Quality Setting”选项。

powervr

如果相机角度允许并且级联设置不会覆盖很多区域的话,适当调整阴影级联的数量也是一个很好的主意。这种情况下,你可以降低级联的数量,从4降到2或者没有级联。

powervr

当然也可以通过改变阴影级联设置从“close”到“stable”来增加有效的阴影地图分辨率,虽然能够增加有效的阴影地图分辨率但是代价是会出现不定的闪烁。

powervr

  • Close fit意味着阴影渲染算法将会尽可能高效的使用设置好的阴影地图分辨率,结果是更高质量的阴影效果,然而这也会导致一些闪烁问题,尤其是当相机或者光移动的时候,我们使用“软阴影”选项可以把这些闪烁隐藏掉。

  • Stable fit表示阴影渲染将尽可能的使阴影边缘稳定,这意味着当相机或者光移动时阴影不会再有闪烁的现象,当然这也会使得阴影质量降低。

“Close fit”和“Stable fit”两者之间的平衡需要仔细的考虑,“close fit”需要较低分辨率的阴影看起来质量更高一些,但是需要更多的过滤(软阴影)来隐藏闪烁,另一方面“stable fit”则需要更高分辨率阴影看起来质量也高一些,但是它不需要太多的过滤,因为它没有闪烁问题。

网格设置

LOD(细节等级)是管理几何图形复杂度非常好的一个工具,当相机远离某个给定的对象时你可以使用它们来对几何图形的详细程度,这种方式不会使屏幕上的几何图形超过一定的数量,而且质量也是足够的。

powervr

注意LOD是移动端优化几何内容非常好的一种方式,设置更高的LOD这样较低分辨率的网格就可以被使用了。

下面的截图展示了如何在质量设置中设置LOD偏差:

powervr

注意减少几何图形负载会帮助减少计算量,使得器件不至于严重发热同时具有更长的电池寿命。

图形设置

如果你需要HDR渲染,使用FP16来取代RG11B10会更好,因为它会提供更好的精度和质量。

powervr

延迟渲染 vs 前向渲染

对于光设置Unity提供延迟渲染和前向渲染两个选项,对于使用很多重叠光源的场景,延迟渲染通常会提供更好的性能,然而在移动端前向渲染则会提供更好的性能,因为一些加速延迟渲染的高级功能比如PLS(像素本地存储)在移动端是不被Unity支持的,对于少量光的场景,前向渲染具有更好的性能因为它的开销更少,下面的截图展示了如何在延迟渲染和前向渲染之间进行选择:

powervr

播放器设置

最新的安卓设备(包括PowerVR)都能够支持Vulkan API,Vulkan真的很好,它能够让你减少CPU的负载,并且更好的控制同步操作。它更适合多核CPU,因为它支持向GPU提交多线程命令。

当选择要使用的API时,Unity会尝试使用最先进的。然而如果硬件平台不支持你选择的API,Unity则会尝试其他API,从而获得最广泛的支持。

如果你选择使用OpenGL,那么使用多线程渲染可能是个好主意,这个选择会确保渲染和其他操作在各自独立的线程下运行,这意味着不同操作会被更好的分配到不同的内核来执行,虽然这不会像Vulkan的多线程命令提交特性那样好,但是这仍然会大大提升CPU的性能。

powervr

着色器

在着色器中对于透明表面可以使用alpha blending取代alpha test/clip()方法,注意alpha test与之前使用的深度测试方法一样会损坏整体架构。在PowerVR平台上,底层原语会在片段处理流水线阶段之前执行深度写入操作,这使得PowerVR设备不会覆盖底层原语的操作,从而节省了大量的计算时间和带宽。

然而PowerVR的alpha tested/discard原语只有在片段着色器执行完成之后才能够进行数据写入缓存操作,这种延迟深度写入会影响性能,因为直到alpha tested原语完成更新深度缓冲区操作后,后续的原语操作才能够执行。

在所有的移动架构平台上,不使用部分色彩遮盖是有好处的,最好设置为RGBA或者0,如果你使用部分色彩遮盖,那么之前的数据帧不得不重新读取,这是由全屏原语操作来执行的,会将它作为纹理来处理,而且这个纹理需要被部分清除,通过提交另一个全屏原语命令来完成。

尽管所有的移动架构平台都非常擅长于半精度计算,但是PowerVR却非常的适合,因此一定要尽可能的利用这个特性,相比高精度(FP32),在着色器中使用半精度(FP16)会带来显著的性能提升,这主要归功于专用的FP16积之和(SOP)计算流水线,在每个周期内能够并行处理两个SOP操作,理论上使浮点操作的吞吐量增加了一倍,FP16 SOP流水线在大部分PowerVR Rougue图形内核上都有采用,当然这取决于具体的型号。

清除标志

对于每一帧确保屏幕被清除是非常有必要的,这样GPU就不需要再从之前的帧缓存中加载图像内容,使用“solid color”或者“天空盒”清除模式来确保GPU不再从内存中加载之前用过的纹理数据。

powervr

在PowerVR平台上,深度准备操作是一件非常反效率的事情,因为GPU不得不进行两次深度测试操作来将深度缓存保存到内存中,从而完成清除冗余操作。你可以通过将相机的清除标志设置为“depth only”或者“don’t clear”来确保Unity不会这样做,我们强烈建议你不要使用这两种模式。

Mipmaps(纹理映射)

与网格(LOD组)的距离等级(LOD)解决方案类似,纹理的LOD解决方案称为mipmapping(纹理映射),随着相机距离的增加mipmapping可以自动降低显示纹理的分辨率,这会显著提升缓存效率,提高性能,降低带宽等,按照下面的截图来设置mipmaps:

powervr

使用mipmaps需要记住的一点是它们只能用于场景内的3D元素,对于2D元素比如UI是1比1映射到屏幕上,因此是不需要的,但是如果它们被缩放那么你可能仍然需要使用mipmaps。

为了确保不同mipmap等级之间的无缝转换,一定要确保在mipmapped对象上使用三线性过滤,如下图所示:

powervr

网格优化

首先确定你启用了网格优化选项,这个设置会重新排列顶点和索引从而更好的利用GPU缓存空间,如下面截图所示:

powervr

移动端的内容优化

移动设备本身就有一些特殊的约束限制,它们要确保电池的电量至少能够使用一天,并且在用户的手上不会出现严重发热等问题,这意味着将电脑上的游戏移植到移动端时,我们必须要进行内容优化。

首先最重要的几何复杂度需要优化,现在电脑屏幕上几何图形的数量通常在2百万到3百万都是可见的,在移动设备上,这个数量一般是20万到30万个多边形,多边形的数量优化完之后,开发者还需要配置文件并且验证顶点着色器是否过于的复杂。

其次是纹理分辨率和带宽的使用,举个例子,后期处理效果需要进行调整来适应移动端设备,在电脑上GPU内存带宽是200B/s到300GB/s,在移动设备上可用的内存带宽是CPU和GPU共享的,大约在20GB/s到30GB/s,尽管这意味着纹理分辨率需要降低一半,但是你也需要考虑到移动屏幕要小的多(电脑屏幕大约20+英寸,移动设备屏幕大约5英寸),所以较小的纹理通常还是足够的,调整之后还需要进行概要分析从而验证结果。

总结

正如上文我们所看到的,Unity提供了一系列选项来优化移动端的内容和游戏,这些都可以在PowerVR上得到很好的应用,尽管不会带来即时的性能提升,但是至少会有效的降低GPU负载,从而节省了电池的电量。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分