UWA发布 | Unity手游性能年度蓝皮书

UWA本次发布的《2023-2024年度Unity手游性能蓝皮书》将汇总游戏行业使用Unity引擎进行手游开发过程中及游戏上线后的性能表现,从测试机型分布、引擎各模块开销、内存占用等方面剖析定位Unity手游性能瓶颈和趋势,反映了Unity手游行业的现状,帮助游戏开发商寻找合适的性能定位和提升方案。

这是侑虎科技原创文章,欢迎转发分享,未经官方授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。


报告目录:
1)Unity手游测试机型分布
2)Unity手游CPU模块性能开销分析
3)Unity手游内存模块性能开销分析
4)Unity手游GPU模块性能开销分析

本次发布我们针对不同档次的机型进行分档,分档的依据为UWA根据设备的算力。以下是每种档位的典型机型:

高端机:小米10、小米11、红米K40、小米9、小米13、小米12、HUAWEI P40、红米K50、Galaxy S21、HUAWEI P40 Pro、华为Mate 40 Pro

中端机:小米8、OPPO R17、荣耀9X、荣耀V20、华为P30、红米K30、红米note8、小米6、小米MIX2

◆◆◆◆

Unity手游测试机型分布

在本周期的游戏研发团队的测试中,我们统计了项目组在日常研发过程中使用的测试手机品牌和具体型号的占比,反映出游戏研发团队用于性能测试的移动设备的选择偏好。

各品牌的使用占比

游戏研发团队用于性能测试的机型主流品牌依次是华为(17%)、小米(15%)、红米(15%)、Vivo (11%)、三星(10%)和OPPO (10%);由于游戏出海的需求,三星手机的占比依然较高,且在出海的地区中三星的占比远高于小米和Vivo。

注:由于一个项目可以同时使用多个品牌的设备进行测试,统计中进行了规范化使占比总和为100% 。


Top 20 测试设备(按项目占比计算)

  • 小米品牌以绝对性优势在测试机型中拔得头筹,Top 3机型分别为小米10、小米8和小米11;
  • 华为品牌的Top 3机型分别是华为P30、华为P40和华为P40 Pro;
  • Top 20机型中没有低端机型。

Top 20 测试设备使用趋势(按项目占比计算)

以小米8、小米10和小米11作为测试机的数量明显提升;

上一年度的低端机代表红米 4X已退出Top 20排名。


通过UWA Pipeline完成自动化测试的占比趋势

我们发现最近一年来,大家在自动化测试方面有了长足的进步,截止到2024年Q1底,已经有23%的UWA性能测评报告通过自动化测试提交到UWA后台分析系统。这说明自动化测试在大量项目组里已经得到了很好地执行和落地,虽然自动化脚本的编写和维护依然有一定的门槛,但很多团队已经找到了突破口,一旦这种体系建立起来,研发的质量和效率都将得到大幅度提高。


FPS均值总体情况

不同档次设备的FPS均值表现

从已有的测试数据看,高达44%的项目帧率在20-30帧之间,24%的项目在45-60帧之间。说明大部分的项目还是趋于30帧的目标做优化,但同时也说明目前已经有较多项目开始以60帧为目标进行游戏开发,高端设备(非顶端)上已经有近25%的项目以60帧作为目标。

在中低端设备上:73%的项目未到达30帧,26%的项目未达到20帧;

在中端设备上:62%的项目未达到30帧;

在高端设备上:50%的项目未达到30帧;

在顶级设备上:37%的项目未达到30帧,3%的项目达到60帧。


不同档次设备的FPS均值走势

顶级设备的帧率(均值)在37帧左右;

高端设备的帧率(均值)在32帧左右;

中端设备的帧率(均值)在29帧左右;

中低端设备的帧率(均值)在24帧左右。


Jank均值总体情况

不同档次设备的Jank值走势

卡顿均值在2023年Q3的表现上仰,后续卡顿值维持在11次/分钟,建议研发团队多使用UWA GOT Online - Overview模式测试,并通过卡顿分析功能来进行检测和优化。


下面我们来具体分析Unity引擎的主流模块的开销情况。

为了能够更好地反映出各个性能参数的整体使用情况,我们统计了每种性能参数的主体使用范围,其范围区间是[5%~95%],以下数据中P5代表5%,P50代表中位值,P95代表95%。

◆◆◆◆

Unity手游CPU模块性能开销分析

一、渲染模块

DrawCall数量的主体范围均值

半透明渲染DrawCall主体范围均值

不透明渲染DrawCall主体范围均值

DrawCall Batches数量的主体范围均值

从上述的数据中可以看出,URP项目在通过合理的Batch之后,基本上都控制在了合理范围内,说明SRP Batch的合批效果非常突出,这也是UWA推荐研发团队要深入学习URP的原因。


Triangle数量的主体范围均值

同屏渲染面片数在不同档次的设备上画质分级效果已经并不突出,建议研发团队进一步加大场景、角色建模的复杂度,将模型的细节更加突出。


二、逻辑代码

GC调用频率(帧/次)

仅有32%的项目将GC调用频率控制在1000帧/次以上;51%左右的项目小于600帧/次,说明GC问题依然值得关注。

不同档次设备的GC调用频率

对于GC的优化,建议研发团队一方面继续优化自身逻辑代码的堆内存分配,一方面推荐大家使用Unity引擎的Incremental GC功能,来降低每帧GC的CPU耗时。


三、UI模块

目前我们主要统计了NGUI、UGUI和FGUI的占比情况。三种UI解决方案在这一年中,总体走势都较为平稳,UGUI依然是垄断地位,最高时可达86%;同时,依然有7%左右的用户在使用NGUI,FGUI的使用比例在7%左右。

UI 类型占比

UI 类型占比走势

接下来,我们以统计范围内最为主流的UGUI来进一步分析。

UGUI耗时均值分布

Canvas.SendWillRenderCanvases CPU耗时均值分布

UI模块的性能开销依然很高,但相较于去年,确实有进一步提升。这主要是在这一年多以来,各大研发团队对于UGUI的理解和掌握都在不断深入。当然,UGUI的使用也会有明显的性能问题,主要有以下四方面:

  1. DrawCall;
  2. 重建;
  3. Overdraw;
  4. 主线程阻塞。

针对以上问题,大家可以通过UWA学堂(https://edu.uwa4d.com)中UI相关的技术文章和视频进行学习和了解,相信对帮助大家快速提升UI方面的技术理解大有裨益。


四、动画模块

Animators.Update耗时主体范围均值

不同档次设备Animators.Update耗时均值走势

除了中低端设备,其他档次设备的动画性能的趋势表现都较为平稳,说明大家对于动画模块的使用较为合理的。除了中端设备,设备动画模块的性能耗时在2023年Q4均有所上涨。

同时,AnimationClipPlayable功能也非常值得研发团队后续研究和关注,它对于动画系统性能方面的提升有很大的潜力可以挖掘。


五、物理模块

Physics.Processing耗时均值的主体范围

物理模块耗时走势

物理模块的整体耗时相对比较平稳,这得益于越来越多的研发团队对于物理引擎开启的必要性做了更深入的了解。

同时,随着大家对于场景和角色物理模拟的逼真度要求越来越高,布料、布娃娃系统相关的插件开始逐步被广泛使用。特别是今年我们关注到不少团队开始使用Magica Cloth并取得了不错的性能效果,因此建议研发团队对其进行研究关注。


六、粒子模块

ParticleSystem.Update耗时的主体范围均值

粒子系统耗时均值走势

不同档次设备粒子系统耗时均值走势

提示研发团队注意两方面:

1)建议针对粒子系统根据不同设备的性能进行不同程度的调整,从而进一步降低粒子系统的CPU耗时和内存占用;

2)针对技能特效建议进行定期自动化地检测,可以参考深圳雷霆的特效自动化检测方案

◆◆◆◆

Unity手游内存分布

一、总体内存

PSS内存占用峰值总体情况

不同内存设备的PSS内存占用峰值

PSS内存占用峰值走势

不同内存设备PSS内存占用峰值走势

4GB内存以下设备的内存占用(中位值)在800MB-1.2GB之间,4GB内存以上设备的内存占用在1.2GB-1.6GB(中位值)之间,且无论是低端、中端还是高端,整体都呈上升趋势。


二、总体堆内存

Mono内存占用峰值总体情况

不同内存设备的Mono内存占用峰值

Mono内存占用峰值走势

不同内存设备的Mono内存占用峰值走势

总体堆内存一直是项目的内存瓶颈,虽然在过去一年有所起伏,整体堆内存都高达90MB以上,且超过1/3的项目高达120MB。这主要是游戏的重度化所致,但另一方面也是研发团队对于Mono堆内存分配疏于管理所致,例如配置文件的序列化库使用不当等,建议研发团队在项目中前期选择序列化库时尽可能做更多的调研或者实验,来制定更合适合于自身项目的序列化配表解决方案。

项目的内存占用很大一部分来自于资源的使用,下面我们将对项目中主流资源的使用情况进行分析。


三、纹理资源内存

纹理内存占用峰值总体情况

不同内存设备的纹理内存占用峰值

纹理内存占用峰值走势

不同内存设备的纹理内存占用峰值走势

虽然硬件设备和画质要求在不断提升,但大家在高内存设备上的画质分级的设计上还不够明显,效果差异尚未拉开。这说明大量项目在中高端设备上并未很好地利用设备的硬件优势,UWA认为,在当下的高端甚至旗舰设备上,大家的游戏品质依然有很大的可提升空间。


ASTC/ETC格式纹理覆盖率走势

ASTC/ETC格式纹理运行时数量占比走势

使用ASTC格式的项目越来越多,且自身资源的数量在项目中的占比也在快速升高。就目前我们观测到的项目而言,在国内,ASTC已经成为目前游戏市场的主流格式,基本上大家可以直接选择该格式成为项目纹理的解决方案。而如果考虑出海,则建议研发团队通过更多当地运营项目或渠道数据来谨慎选择ASTC或ETC2格式。


四、网格资源内存

网格内存占用峰值总体情况

不同内存设备的网格内存占用峰值

网格内存占用峰值走势

不同内存设备的网格内存占用峰值走势

网格峰值内存的中位数使用内存均在30MB以下,该值偏低,由于设备内存在不断增加,研发团队可以考虑进一步加大场景、角色建模的复杂度,将模型的细节更加突出。


五、动画资源内存

动画片段内存占用峰值总体情况

不同内存设备的动画片段内存占用峰值

动画片段内存占用峰值走势

不同内存设备的动画片段内存占用峰值走势

动画模块的内存使用趋势在2023年Q3有明显的上升,峰值内存的均值长期维持在20MB之内。


六、Shader资源内存

Shader内存占用峰值总体情况

不同内存设备的Shader内存占用峰值

Shader内存占用峰值走势

不同内存设备的Shader内存占用峰值走势

Shader资源内存峰值大幅上升的主要原因是不少项目进行了Unity版本的升级,属于正常现象。Unity 2019.4.21以后,Shader的内存统计发生了变化。原来统计在ShaderLab中的内存现在也被算在Shader资源本身了。

这里,UWA仍然需要提醒的是,Standard Shader在大家的项目中被经常误引入进来,建议大家在UWA性能简报中的"具体资源使用信息"中特别关注Standard Shader的使用情况。

同时,也建议研发团队结合本地资源检测服务,对Shader相关的规则做检测,尤其是变体数量。


七、RenderTexture资源内存

RenderTexture内存占用峰值总体情况

不同内存设备的RenderTexture内存占用峰值

不同内存设备的RenderTexture内存占用峰值分布

RenderTexture内存占用峰值走势

不同档次设备的RenderTexture内存占用峰值走势

不同档位机型上的RenderTexture内存占用都有波动,且在RT的效果分级上取得了一定的成效。


八、粒子系统资源内存

粒子系统内存占用峰值总体情况

不同内存设备的粒子系统内存分布占用峰值

不同内存设备的粒子系统内存分布占用峰值

粒子系统内存分布占用峰值走势

不同档次设备的粒子系统内存分布占用峰值走势

粒子系统的使用数量在逐步提升,并保持在10~25MB之间,说明游戏团队的特效品质在不断提升。UWA建议大家在不断提升特效品质的同时,切记要经常检测特效的制作质量和性能开销,因为美术人员如果不了解特效的制作特点,很可能会造成"做的越多、返工越多"的现象,这样就会造成大量的研发资源浪费,甚至导致项目上线的延期。

对此,UWA推出的本地资源检测服务,针对项目工程中的静态资源(比如纹理、网格、音频、动画以及粒子系统、代码设置等等)可做检测,来检测美术资源是否有设置不合理,做到静态资源的及时问题反馈、及时修复。

◆◆◆◆

Unity手游GPU模块性能开销分析

GPU重要性能参数

从2023年的Q2开始,我们的GOT Online产品开始陆续推出GPU端的性能分析指标,我们希望通过提供更多有价值的性能指标,来为游戏项目在GPU方面提供更好的分析和优化方案。通过这一年来的摸索,我们在整个行业内积累了大量的GPU端相关性能数据,接下来,我们将针对较为重要的指标来进行分享,希望这些统计数据能够对大家理解和分析自己项目在GPU端的性能问题有所帮助。由于过去一年内,UWA的GPU性能指标陆续上线,且针对不同品牌的芯片,其性能指标也差异很多,所以接下来的数据展示主要来自于Mali和高通芯片,且对其对应的性能参数进行了归类,希望可以让这些性能指标更符合大家的理解。

1. GPU耗时均值走势
GPU耗时是每个项目都最为关注的GPU性能指标,我们在这个方面迭代了大量的计算版本来提升该数值的精准性。目前该数值可以针对不同的芯片来进行较为精准地反馈,下面是Mali芯片和Adreno芯片上该指标的性能趋势。

从上图可以看出,无论是何种芯片,GPU耗时均值均在15~25ms区间内,且有小幅上升的趋势。但是,当我们进一步按照设备档位来进一步细分GPU开销时,则会明显发现,当下游戏在中低端设备上的GPU性能压力较大,如下图所示,P95数值均大幅高于33ms。

2. GPU Clocks指标统计
为了更精准地让研发团队了解到自己项目的GPU压力,我们也统计了GPU Clocks指标的参数范围和变化趋势,具体如下图所示。

GPU Clocks均值走势

通过趋势图我们可以看出游戏项目依然再向精品化趋势过渡,但研发团队更需要关注的是该参数的主体,通过主体范围的相关数值,研发团队可以进一步针对自身项目来衡量和制定自身项目的研发标准。

GPU Clocks均值主体范围分布

GPU Clocks峰值走势

GPU Clocks峰值主体范围分布

3. GPU利用率(GPU Utilization)
以Mali芯片为例,我们统计了近一年来,大量项目的利用率均值和峰值分布情况,如下图所示:

GPU Usage均值主体范围分布

GPU Usage峰值主体范围分布

从上图可以看出,目前大部分游戏项目在中低端档次设备上,都存在不同程度的GPU利用率过大问题,这样和上面GPU耗时分析相吻合,因此,建议研发团队特别关注自身项目在中低端档次设备上的GPU性能压力,对设备分级和GPU性能选择进行更进一步的细致划分,从而提高中低端设备玩家的游戏体验。

4. Fragment Shaded参数统计
该参数统计每帧设备通过Fragment Shader来渲染的像素值,就目前移动游戏而言,其最大的GPU性能压力主要(80%+)来自于Fragment Shading。所以,在UWA GOT Online报告中,会非常详细地对其进行统计和分析。下图为不同芯片厂商中,Fragment Shaded参数的均值和峰值趋势走势。从图中可以看出,虽然均值走势相对比较平稳,但峰值走势却在近两个季度大幅上升。这也预示着未来GPU性能瓶颈依会在整个游戏行业进一步凸显。

Fragment Shaded参数均值趋势

Fragment Shaded参数峰值趋势

近一年来,该性能参数在不同芯片上的分布范围,我们将其重点罗列如下,研发团队可以根据自己项目的GOT Online报告来进行比对。

Fragment Shaded均值主体范围分布

Fragment Shaded峰值主体范围分布

5. 总体带宽均值走势
GPU带宽是GPU端非常重要的性能指标,特别是在当下的移动游戏上。因为带宽过高会直接影响设备发热,进而导致设备降频。设备一旦降频,无论是CPU还是GPU,其性能均会受到极大影响,所以,移动游戏研发团队需要不断关注自己项目的GPU带宽问题,及早发现、尽快解决。

下图为Mali芯片和Adreno芯片的平均带宽占用趋势,基本上都控制在60~80MB/帧,该范围较为合理。因为如果游戏以30帧/秒的帧率进行运行,那么每秒的GPU带宽将达到1.8~2.4GB,一般我们建议主流机型(比如小米10)的带宽量尽可能控制在3.0GB/秒以下较为合适,但如果您的游戏希望达到60帧,那么该流量则过大了,会很快导致设备发热进而降频,因此,UWA建议研发团队尽早通过量化指标来建立研发标准,否则越到研发后期,返工成本越高。

总体带宽均值主体范围分布

6. Overdraw分析
Overdraw对于GPU性能的重要程度不言而喻,Overdraw层数越高,意味着每帧GPU要渲染的像素越多,如果Shader的复杂程度也很高,那么GPU的性能压力将会十分巨大。因此,在GOT Online报告中就非常重视Overdraw层数的分析,下图则是这一年来现有测试游戏Overdraw的统计分析,我们将以均值和峰值来进行展示。

Overdraw层数均值走势
在最近一年的移动游戏测试中,无论是Mali芯片还是Adreno芯片,其Overdraw层数基本上都维持在6~8层左右,如下图所示。

Overdraw层数均值主体范围分布
下图则是两款芯片上Overdraw层数的细致分布情况。

Overdraw层数峰值走势
在峰值方面,Overdraw层数峰值逐季度上升,如下所示。一方面随着我们GPU模式的推出,最近一年的GPU测试游戏项目在不断增加;另一方面,也是移动游戏同样在朝着精品化不断发展。对此,UWA建议研发团队在研发过程中,特别注意Overdraw的峰值区域,查看其是否使用合理。一般情况下,造成Overdraw层数较高的原因主要如下:
(1) 技能特效、场景特效(烟、雾、云等)的不合理制作;
(2) UI界面的叠层过多,特别是不可见的UI界面需要特别注意,"不可见"不代表不渲染;
(3) 多个渲染相机同时工作,但玩家很可能只看到少数几个。这种情况本质与第(2)点相同,玩家没看到,但GPU确实实时渲染,造成不必要的资源计算浪费。

造成Overdraw层数过高的情况还有很多,在此我们无法一一列举,但我们建议研发团队在日常的研发工作中,尽可能将其作为性能测试的常备观察项,以便及时发现问题,及时解决问题。

Overdraw层数峰值主体范围分布

我们深信数据是会说话的,总有规律值得我们追溯求实、鉴往知来。同时我们也会不断细化评析的标准、分类等,让数据更具有代表性和说服力。

*本报告中的数据最终解释权归侑虎科技所有。

相关推荐
向宇it6 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
Heaphaestus,RC8 小时前
【Unity3D】获取 GameObject 的完整层级结构
unity·c#
芋芋qwq8 小时前
Unity UI射线检测 道具拖拽
ui·unity·游戏引擎
tealcwu9 小时前
【Unity服务】关于Unity LevelPlay的基本情况
unity·游戏引擎
大眼睛姑娘11 小时前
Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材
unity·游戏美术
鹿野素材屋15 小时前
Unity Dots下的动画合批工具:GPU ECS Animation Baker
unity·游戏引擎
小春熙子1 天前
Unity图形学之着色器之间传递参数
unity·游戏引擎·技术美术·着色器
虾球xz1 天前
游戏引擎学习第15天
学习·游戏引擎
Java Fans1 天前
在Unity中实现电梯升降功能的完整指南
unity·游戏引擎
GrimRaider1 天前
[Unity]TileMap开发,TileMap地图缝隙问题
unity·游戏引擎·tilemap