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