Unity针对高低端机型的优化

1.为什么要区分高低端机型

我们在制作游戏项目时,画质和流畅度都是非常重要的。市面上的游戏设备百花齐放,各大厂商推出不同型号、不同性能的设备来满足大众的需求。
一款游戏的画质和流畅度是决定游戏能否畅销的关键,而画质和流畅度又需要靠设备来支撑,不同性能的设备会导致游戏产生不同的效果,这是最让人头疼的。辛苦开发的游戏不能在某些设备上顺畅地运行起来,出现画质糟糕、画面过慢、画面卡顿,甚至崩溃等问题,影响了游戏的可玩性,也影响了游戏在市场上的前景。
为了让市场上不同机型的设备都能流畅地运行游戏,我们需要区别对待,比如,在高端机型中使用画质好的画面,而在低端机型中使用差一点的画质。因为低端机型内存低,CPU性能差,设备中部件之间的配合并没那么好,所以,如果让其使用高端机型的画质,运行就会不流畅。

2. 如何处理高低端机型的画质问题

高低端机型的区别对待,我们可以从以下几个方面入手。

(1)UI贴图质量区别对待

针对不同的机型,分别使用不同的两套UI贴图,其中一套是针对高端机的,无任何压缩,无缩小;另一套是针对低端机的,对UI贴图进行了压缩,且缩小了UI贴图的大小。后面我们会详细讲解如何在游戏中使用NGUI和UGUI无缝地切换高低质量的UI画面。

(2)模型和特效使用资源区别对待

针对不同的机型,分别使用不同的特效和模型,将资源分为1、2、3、4、5这五个等级,针对不同的设备使用不同的等级。
特效在项目中最常见、也使用得最频繁,高质量的特效能直接导致低端机卡顿,因此,在低端机中要更换低质量的特效,甚至在非关键部位可不使用特效。低面数模型则可以减轻渲染时GPU的负担。

(3)阴影的使用情况区别对待

针对不同的机型,分别使用不同质量的阴影,或者不使用阴影。
场景中的模型物体越多,材质球数量就越多,实时阴影的计算量与渲染量也就越多。在低端机上保持顺畅是第一位的,如果能不使用阴影那是最好的,直接省去了阴影的计算。假如一定要使用,那我们也有办法减低阴影计算和渲染的消耗。
下面是针对高低端机型对阴影处理的几种方法。
方法1:使用Unity3D提供的阴影渲染设置接口,通过QualitySettings.shadowResolution设置渲染质量,QualitySettings.shadows设置有无和模式,QualitySettings.shadowProjection设置投射质量,QualitySettings.shadowDistance设置阴影显示距离,QualitySettings.shadowCascades设置接受灯光的数量等。
在高端机上使用高质量阴影渲染设置,在中端机上使用中端阴影渲染设置,在低端机上则使用低端阴影渲染设置,甚至可以关闭阴影渲染设置。
方法2:关闭传统的阴影渲染设置,以简单的底部圆形黑色阴影面片代替。
用一些简单的阴影面片替换阴影,用内存替换CPU。这样就省去了计算阴影的CPU消耗,还能看见在底部存在阴影。
方法3:静态阴影烘焙。场景内的物体大多是不会动的,我们可以采用烘焙的方式来减少一些实时的阴影算力。

(4)整体贴图渲染质量区别对待

针对不同的机型,分别使用不同的贴图渲染质量。
Unity3D中可对贴图渲染质量进行设置,QualitySettings.masterTextureLimit的API默认是0,就是不对贴图渲染进行限制,假如设置为1,就是渲染1/2大小的画质,相当于压缩所有要渲染的贴图大小至原先的1/2大小,假如设置为2,就是渲染1/4画质,以此类推。
对所有贴图进行渲染限制是一个大杀器,能直接让CPU和GPU的消耗下降,但画质也遭到了毁灭性的打击,我们需要它在低端机上发挥作用,但也要谨慎使用。

3. 怎么用程序区分高低端机型

下面是区分高低端机型的几个方法。
1)Apple机型。毕竟iOS的型号是有限的,因此可以把其中一些型号的机子归类为高端,另一些型号的机子归类为中端,还有一些型号的机子归类为低端。Unity3D中的API有可以用的接口,例如,UnityEngine.iOS.Device.generation==UnityEngine.iOS.DeviceGeneration.iPhone6等,以此类推,就能区分Apple机型了。
2)Android等其他机型。由于机子型号太多,我们可以用CPU型号、内存大小、系统版本号、屏幕分辨率大小、平均帧率等判断是高端机还是低端机。
例如,3GB内存或以上的为高端机,1GB或以下的是低端机,其他为中端机。也可以根据系统的版本号来判断,Android 9.0以上的为高端机,Android 6.0以下的都是低端机,其他为中端机,又或者分辨率大的为高端机等。不过,通过一些简单的规则将高低端机型区分开来会有很大问题,例如,有些山寨机内存很大,CPU却很烂,安卓版本很高,但内存却很小,所以我们希望有一个综合考虑硬件的系数,可以为每个硬件给出一个评分,最后将CPU型号、内存大小、系统版本号、屏幕分辨率大小、GPU型号这几个硬件的评分综合起来,得出一个总分,用这个分数来判断是高端机、中端机抑或是低端机,这样会比较合理一些。
除了上述区分方法,还可以通过平均帧率来判定高低端机型。
在游戏中加入统计平均帧率的程序,将机型型号、CPU型号和平均帧率发送给服务器端,由服务器记录各机型型号的平均帧率,再统计出一份报表给客户端,客户端根据这份统计报表来决定哪些机型型号是高端设备,哪些机型型号是低端设备。得到数据后,再通过设置不同级别的画质来优化高低端设备的游戏流畅度。
区分高低端机型时,我们可以将这三种方法一起使用,因为Android中有一些是有固定名称或者编号的机型,我们可以很方便地确定它的类型,有些没有确定型号,就需要通过了解设备的硬件情况来确定机型了,那些完全不能确定机型的,就只能在统计中得到答案了。

4. UI贴图质量的区别对待

在针对不同机型优化时,UI贴图质量的区别对待是一个比较重要的手法,下面将对此方法进行详细介绍。
在开发游戏时,免不了要针对不同机型做不同的处理,让游戏在高画质和低画质之间切换,在判定设备的情况后,可以实时切换游戏品质,让游戏更加流畅。
NGUI和UGUI的切换方式有所不同,NGUI基于图集Atlas,而UGUI是基于Image Unity3D4.6.1后的Sprite 2D的。UI画质切换在NGUI和UGUI里都是基于两套图和两套Prefab实现的。它们的共同特点是,所有原生态的高画质(HD)Prefab都使用脚本工具生成相应的标准画质(SD)Prefab。
可使用程序把高清UI和标清UI做成两个不同的Prefab,两个UI的功能是相同的,只是对应的图集质量不同罢了。然后在高端机型中运行高清UI,在中低端机型中运行标清UI,这使得不同的机型都能流畅地运行游戏,而且它们拥有相同的功能。
这个生成高低画质Prefab的程序的运行的步骤是,先把所有UI用到的图集、材质球都复制一份到固定文件夹下,再复制一份Prefab存放在文件夹下面,并让Prefab里与图集有关的变量都指向标清材质球或者标清图集,也可以是标清单张图。
下面来看看实时切换高清和标清UI时的具体步骤。
将一套UI图复制成两套图。一套高清,一套标清,高清Prefab指向高清图,标清Prefab指向低清图。
这里NGUI和UGUI中使用的方法不同。NGUI需要制作两个Atlas Prefab,再通过修改内核将Atlas实时更换掉,也可以复制并制作另一个SD UI Prefab,只改变Atlas中指向标清画质的部分。UGUI稍微复杂一点,但原理差不多,虽然它不能实时改变图集来切换高清画质和标清画质,但也可以通过制作一个SD Prefab来达到高清和标清切换的目的。步骤是,首先复制所有图片到SD文件夹,并加上前缀SD,这样好辨认,然后复制一个相同的UI Prefab,将其命名为SD UI Prefab,再把复制过来的SD UI Prefab里的图都换成SD里的图。这样,高清和标清UI Prefab都有了相同的逻辑,只是指向的图不同而已。
程序是选择SD还是HD,只需要关注Prefab的名字即可。Prefab名字在高清和标清之间,只是前缀不一样,高清的前缀为HD或者没有前缀,而标清的文件名前缀统一设置为了SD,所以加载时很容易通过前缀名区分开来。
NGUI和UGUI制作SD Prefab的流程可以通过编写一个脚本程序一键搞定,就不用再手动一个个复制,一个个修改了。
在开发过程中,我们只要维护好HD UI Prefab就可以了,在打包前使用脚本一键构建SD UIPrefab能节省不少时间,提高效率。
这样一来,在制作过程中,我们不用再关心SD的事情,完全可以只把注意力和精力集中在做好高清的UI图上。关于标清SD的问题,脚本程序已经帮我们全部搞定。

5.后续

持续关注,后续会增加《区分设备高中低配》的代码实现。

猜你喜欢

转载自blog.csdn.net/qq_34035956/article/details/127485638