Unity 手游性能蓝皮书 2019 - 2020 (卡牌篇)
卡牌手游总体性能开销分析
Android设备的CPU均值主体范围为7.956.2 ms,且主要集中在1733ms和< 17ms两档。
按照UWA官网(www.uwa4d.com)的测评机型分类,我们将统计的性能数据分为低端、中端和高端;在趋势图中则直接以最具有代表性的低端和高端来展现。
大部分卡牌手游在中低端设备的性能开销较好,大于33ms的耗时占比范围仅占30%。
无论是高端还是低端的Android设备,渲染和逻辑代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的近80%。
下面我们就来具体分析这些主流模块的开销情况。
卡牌手游CPU模块性能开销分析
一、渲染模块
严重程度:普通
为了能够更好地反映出各个性能参数的整体使用情况,我们统计了每种性能参数的主体使用范围,其范围区间是[5%~95%],以下数据中P5代表5%,P50代表均值,P95代表95%。
在过去的4个季度中,半透明渲染和不透明渲染在高端和低端设备上的性能均较为稳定。
二、逻辑代码
严重程度:地狱
- GC触发频率很高,是造成卡顿的主要原因之一,目前只有51.2%的项目可以将GC的触发频率控制在1000帧/次以上。
- 游戏玩法越来越重度化,GC平均耗时在逐步上升。GC耗时会逐渐成为游戏运行时的主流性能杀手,需要研发团队时刻注意。
我们可以看到,在过去的Q2中,Instantiate调用频率有明显下降,这说明大家在项目中不断重视对于资源Instantiate/Destroy的管理。
如果大家的项目中仍有大量的Instantiate/Destroy调用,那么我们建议您着重查看UWA线上性能报告中资源管理分类的“资源实例化/激活”页面,通过它可以快速掌握到底具体哪些GameObject在不停地被执行实例化操作,从而更为高效地减少不必要的性能开销。
Shader.Parse 操作是比较突出的性能杀手,但我们看到在2019的Q4中已经大幅度下降,目前平均每次调用的CPU耗时主要分布在 0.7~76.8 ms。
三、UI模块
严重程度:地狱
目前我们主要统计了NGUI和UGUI的占比以及详细的使用情况。在刚刚过去的四个季度中,UGUI的使用占比依然强势,最高时可达97%。NGUI的占比有明显下降的趋势。
下面我们将分别说明它们的CPU耗时和堆内存占用情况。
UI模块的性能开销依然很高,但相较于去年相比确实有进一步提升。这主要是在这一年多以来,各大研发团队对于UGUI的理解和掌握都在不断深入。当然,现在UGUI的明显性能问题主要有以下四方面:
- Draw Call;
- 重建;
- OverDraw;
- 主线程阻塞。
针对以上问题,大家可以通过UWA学堂(https://edu.uwa4d.com)中UI相关的相关技术问题和视频进行学习和了解,相信对帮助大家快速提升UI方面的技术理解大有裨益。
四、动画模块
严重程度:普通
动画模块在最近一年来的性能表现一直较为平稳,这说明大家对于动画模块中应有的性能优化点掌握已经较为到位。
五、物理模块
严重程度:普通
物理模块的性能存在上升趋势,特别是高端设备上。对于使用Unity 2017.4版本以后的团队,Auto Simulation和Auto Sync Transforms是大家需要关心的参数,以避免不必要的性能耗时。
六、粒子模块
严重程度:普通
粒子系统的CPU开销普遍较低,但总体使用数量峰值在2020 Q1后大幅上升。我们依然建议研发团队尽可能将数量峰值控制在600以下(低端设备)和1000以下(中高端设备)。对此,建议研发团队经常通过以下两方面来检测自己的粒子特效使用情况:
- 粒子系统(特别是技能特效)的配置文件是否过量;
- 特效中是否含有长久不用的粒子系统。
卡牌手游内存模块开销分析
内存泄露
严重程度:噩梦
我们建议研发团队后续可更为频繁地进行检测和监控,即可进一步降低堆内存泄露的风险。研发团队可通过以下两种方式高效地对堆内存泄露函数进行分析和优化:
- UWA GOT Online中的详细Mono堆内存分析和Lua性能分析报告;
- UWA线上深度测评中的详细Mono堆内存测评报告。
总体内存
严重程度:噩梦
总体内存在最近的一年里,峰值均值较为稳定。对此,我们将在接下来的文章中进行详细分析。
总体堆内存
严重程度:噩梦
总体堆内存在最近一年里在70-80MB震荡。
项目的内存占用很大一部分来自于资源的使用,下面我们将对项目中主流资源的使用情况进行分析。
纹理资源内存
严重程度:噩梦
如上图所示,对于纹理资源来说,在过去的2个季度中,其内存占用处于下降阶段。建议研发团队对于纹理Mipmap使用情况、渲染利用率等进行进一步的检测和完善。
网格资源内存
严重程度:普通
网格资源内存峰值主要分布为1.5~ 64.8 MB。其最近一年的使用趋势较为平稳,均值均在20MB-30MB浮动。
动画资源内存
严重程度:普通
动画模块的内存使用趋势较为平稳,平均峰值内存长期控制在20~30MB区间之内。
Shader资源内存
严重程度:普通
这里,UWA仍然需要提醒的是,Standard Shader在大家的项目中被经常误引入进来,建议大家在UWA性能简报中的“具体资源使用信息”中特别关注Standard Shader的使用情况。
RenderTexture资源内存
严重程度:噩梦
RenderTexture的内存占用在进入2020年Q1以后上升趋势明显,特别是在低端设备上,随着大家对于图像后处理效果的需求提升,后续很可能会出现RenderTexture使用程度大幅提升的情况,因此,建议研发团队对RenderTexture密切关注。
粒子系统资源内存
严重程度:噩梦
粒子系统的使用数量过大,从而导致其内存占用过高。对此,其最有效的优化方法还是降低粒子系统的使用数量,同时研发团队可以考虑在高端设备上使用GPU Particle 新功能,将大幅度提升粒子模块的性能。
卡牌手游资源管理分析
AssetBundle加载方式(Load和LoadAsync)的使用占比在过去的一年中都保持在80%左右。毫无疑问,AssetBundle加载方式是目前绝大多数研发团队的资源加载首选。
在接下来的一年中,我们仍然建议大家使用AUP(Async Upload Pipleine)功能来尝试达到更高的加载效率。关于AUP中需要特别关注的技术点,建议查看UWA DAY 2019中的相关分享《Unity引擎加载模块和内存管理的量化分析及优化方法》,同时,我们在今年UWA DAY 2020上有了更详细的补充,建议大家后续关注。
在众多加载方式中,LoadFromFile加载方式依然是一家独大,LoadFromFile+LZ4的组合在移动游戏中加载性能优势明显,依然是移动游戏资源加载的不二选择。
- 对于Instantiate/Destroy的完善,研发团队需时刻关注缓存池的使用是否合理;
- 对于Active/Deactive的完善,则需要研发团队尽可能注意避免UI和动画角色的频繁调用,从而尽可能避免不必要的调用开销。