Unity 手游性能蓝皮书 2020 - 2021
报告目录:
- Unity手游测试机型分布
- Unity手游CPU模块性能开销分析
- Unity手游内存模块性能开销分析
本次发布我们针对不同档次的机型进行分档,以下是每种档位的典型机型。
- 高端机:小米8、荣耀V20、OPPO Find X
- 中端机:OPPO R17、红米Note 8、华为P10
- 低端机:小米5X、OPPO A57、荣耀7X
Unity手游测试机型分布
在最近一年游戏研发团队的测试中,我们统计了大家在日常研发过程中使用的测试手机品牌和具体型号的占比,这可以反映出游戏研发团队在测试性能过程中对于移动设备的选择偏好。
从移动设备品牌的角度来看,游戏研发团队在平时测试使用中的主流品牌依次是华为(23%),小米(20%)、红米(13%)、OPPO (11%)、三星(10%)和Vivo (10%);由于出海的原因,三星手机的占比依然很高。
在过去的一年中:
- 小米品牌以绝对性优势在测试机型中拔得头筹,Top3机型分别为小米8、小米10、小米6;
- 华为品牌的Top3机型分别是华为Mate 30、华为Mate 20 Pro和华为P20;
- OPPO品牌相对占用率较低,但OPPO R17是该品牌中最受欢迎的测试机型,占比较高;
TOP 10的机型中,小米6、OPPO R17、小米5X是较为欢迎的低端机型。
在过去的一年中,以小米8和OPPO R17作为测试机的数量明显提升。
红米4X作为出海的主流低端设备依然受开发者关注,未来的需求趋势可能更明显。
从已有的测试数据看,高达44%的项目帧率在2030之间,26%的项目在4560之间。说明大部分的项目还是趋于30帧的目标做优化,但同时也说明目前已经有较多项目开始以60帧为目标进行游戏开发。
- 在低端设备上:78%的项目未到达30帧的标准,31%的项目未达到20帧;
- 在中端设备上:62%的项目未达到30帧的标准;
- 在高端设备上:48%的项目未达到30帧的标准。
- 高端设备的帧率(均值)在36帧上下;
- 中端设备的帧率在30帧上下;
- 低端设备在Q2有明显下降,现维持在23帧左右。
卡顿均值在2021 Q1~Q3持续提升,在Q4略有下降,但卡顿值依然保持在11次/分钟,建议研发团队多使用GOT Online - Overview模式测试,并通过卡顿分析功能来进行检测和优化。
下面我们来具体分析Unity引擎的主流模块的开销情况。
为了能够更好地反映出各个性能参数的整体使用情况,我们统计了每种性能参数的主体使用范围,其范围区间是[5%~95%],以下数据中P5代表5%,P50代表均值,P95代表95%。
Unity手游CPU模块性能开销分析
一、渲染模块
在过去的一年中,半透明渲染耗时的走势较为平稳,这是因为半透明渲染主要来自于UI和粒子系统,场景中的草(Alpha Blend渲染方式)、云和水体也属于半透明渲染中,但相对于UI和粒子系统,这些在绝大部分游戏中并不是半透明渲染的耗时主力。UI界面的复杂程度在这一年中并无太大变化、粒子系统的分级其实是目前大部分研发团队较为忽视的一点。所以,在这一整年的过程中,半透明渲染的耗时趋势都较为平稳。
无论是高端、中端还是低端设备,不透明渲染耗时普遍都在下降;一方面是对于不透明渲染中的场景物体,其Draw Call Batching技术已经被大多数团队所熟知和熟练使用,另一方面则是越来越多的新项目开始使用URP来作为项目的主要渲染方式,随着SRP Batcher功能的使用越来越成熟,其为大家项目的不透明渲染带来了较大的性能提升。
从上述的数据中可以看出,大家目前已经可以针对不透明渲染根据不同档次的机型进行不同的渲染分级;而在半透明渲染中,Draw Call在不同档次中的分级效果不明显。这主要是因为粒子系统的分级不明显所致,建议研发团队后续对其分级进行关注和加强。
同屏渲染面片数已经在不同档次的设备上进行了更为合理的分级,研发团队可以根据上述的分级数值来针对自身项目的使用数量进行查看。该分级策略主要还是体现在不透明渲染中,特别是针对超大场景的复杂渲染,这种分级策略尤为重要。
在统计的项目中,SRP的数量在持续上升,到Q4结束基本上已经高达35%;说明3个项目中已经至少有1个是使用SRP的,未来趋势也会越来越明显。建议研发团队在后续的新开游戏项目中,尽可能学习并使用SRP功能。
二、逻辑代码
26%的项目能把GC调用频率控制在1000帧/次以上;50%左右的项目都是小于600帧,说明GC问题值得关注。对于GC的优化,建议研发团队一方面继续优化自身逻辑代码的堆内存分配,一方面尝试使用Unity引擎的增量GC功能,来降低每帧GC的CPU耗时。
三、UI模块
目前我们主要统计了NGUI、UGUI和FGUI的占比情况。UGUI的使用占比不仅强势还在稳步提升,最高时可达80%;依然有15%左右的用户在使用NGUI,FGUI的使用比例在6%左右。
以下是NGUI、UGUI和FGUI的CPU耗时开销;
UI模块的性能开销依然很高,但相较于去年相比确实有进一步提升。这主要是在这一年多以来,各大研发团队对于UGUI的理解和掌握都在不断深入。当然,现在UGUI的明显性能问题主要有以下四方面:
- Draw Call;
- 重建;
- OverDraw;
- 主线程阻塞。
针对以上问题,大家可以通过UWA学堂(https://edu.uwa4d.com)中UI相关的相关技术问题和视频进行学习和了解,相信对帮助大家快速提升UI方面的技术理解大有裨益。
四、动画模块
动画模块的性能耗时较为稳定,但是在低端设备上在Q2时有所上涨。同时,AnimationClipPlayable功能也非常值得研发团队后续研究和关注,它对于动画系统性能方面的提升有很大的潜力可以挖掘。
五、物理模块
在Q4测试的部分项目中,物理模块被深度使用,大家对于场景和角色物理模拟的逼真度要求越来越高。布料、布娃娃系统开始逐步被广泛使用,建议研发团队对该方面的技术进行关注和研究。
六、粒子模块
在这一年中,粒子系统的耗时走势较为平稳,且使用的粒子系统数量并没有在不同档次的设备上显示出不同程度的差异,这说明大部分项目中对于粒子系统的使用基本上是没有分级的,无论是场景中的粒子特效,还是角色的技能特效,对于针对不同档次设备的质量分级都设置得不细致。对此,非常建议研发团队后续针对粒子系统根据不同设备的性能进行不同程度的调整,从而进一步降低粒子系统的CPU耗时和内存占用。
Unity手游内存分布
总体内存
硬件设备内存的变化较为稳定。在不同档位的设备上差异并不明显,4G内存以下设备的内存占用在800900MB之间,4G内存以上设备的内存占用在950MB1.1GB。
总体堆内存
总体堆内存一直是项目的内存瓶颈,虽然在过去一年有所起伏,但是无论是4G内存以下或是以上的设备,堆内存都高达100MB以上。这主要是游戏的重度化所致,但另一方面也是研发团队对于Mono堆内存分配疏于管理所致,例如配置文件的序列化库使用不当。
项目的内存占用很大一部分来自于资源的使用,下面我们将对项目中主流资源的使用情况进行分析。
纹理资源内存
建议研发团队对于纹理Mipmap使用情况、渲染利用率等进行进一步的检测和完善。
使用ASTC格式的项目越来越多,且自身资源的数量在项目中的占比也在快速升高,2022年的国内市场,ASTC格式取代ETC格式已经成为必然趋势;
当然,如果您的游戏考虑到出海问题,对于海外设备较为低端的国家或地区,仍需要考虑ETC格式的使用。
网格资源内存
网格资源的内存占用较为稳定,从使用趋势上来看,较为平稳,4G内存以下设备网格内存在30MB左右,4G内存以上的设备网格内存在40~50MB之间。
动画资源内存
动画模块的内存使用趋势较为平稳,平均峰值内存长期控制在30MB之内。
Shader资源内存
Shader资源内存峰值大幅上升的主要原因是不少项目进行了Unity版本的升级,属于正常现象。Unity 2019.4.21以后,Shader的内存统计发生了变化。原来统计在ShaderLab中的内存现在也被算在Shader资源本身了。
这里,UWA仍然需要提醒的是,Standard Shader在大家的项目中被经常误引入进来,建议大家在UWA性能简报中的“具体资源使用信息”中特别关注Standard Shader的使用情况。
RenderTexture资源内存
RenderTexture的内存占用在21年Q2~Q3这6个月内小幅提升;即使在低端设备上也有提升,从35MB上升到50MB;后续很可能会出现RenderTexture使用程度大幅提升的情况,因此,建议研发团队对RenderTexture密切关注。
粒子系统资源内存
粒子系统的使用数量在逐步提升,并在Q4有明显的回落,保持在18~30MB之间。对此,其最有效的优化方法还是降低粒子系统的使用数量,同时研发团队可以考虑在高端设备上使用GPU Particle 新功能,将大幅度提升粒子模块的性能。