报告目录:

一、ARPG手游总体性能开销分析

二、ARPG手游CPU模块性能开销分析

三、ARPG手游内存模块性能开销分析

四、ARPG手游资源管理分析

五、UWA对于ARPG手游研发团队的建议

一、ARPG手游总体性能开销分析

iOS设备的CPU性能普遍高于Android设备,Android设备的CPU均值主体范围为12.4~66.2 ms,iOS设备的CPU均值主体范围为7.0~57.5 ms。

我们选择了测评次数最多的四款机型来进行统计,这四款机型分别是红米2、红米Note2、华为6Plus和三星S6。

1)大部分ARPG手游在中低端设备的性能开销较高,在Android设备上,CPU耗时集中在17~50ms区间,而在iOS设备上,CPU耗时集中在33ms以内。
2)相较2016年同期,2017 Q2 ARPG手游在低端设备上的CPU开销均值增长5.8 ms。

无论是高、中、低端的Android设备,渲染、UI、加载/代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的80%。

下面我们就来具体分析这些主流模块的开销情况。

二、ARPG手游CPU模块性能开销分析

1、渲染模块

严重程度:地狱

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

在Draw Call使用上,ARPG手游的使用程度略低于MMORPG手游,且对Draw Call的控制同样较高,UWA建议Draw Call占用的P95 < 200,76.3%的项目可以将其控制在这个范围内。

1)ARPG手游的场景渲染三角形面片数量普遍较高。且设备性能越高,数量峰值越高。经过统计,在中低端设备中,46.5%的项目能将渲染三角形面片数控制在100K以下。
2)ARPG游戏的场景复杂程度明显低于MMORPG游戏,渲染面片峰值要比MMORPG手游平均低50K。同时,虽然2016 Q4和2017 Q1渲染面片数量大幅上升,但2017 Q2开始回落趋势较为明显。

Graphics.Bilt操作平均每次调用的CPU耗时主要分布在: 0.1~8.5ms。该项CPU开销在低端设备上的上升趋势较为明显,但在2017 Q1大幅下降。这主要是因为,在2017 Q1后,ARPG项目普遍开启了多线程渲染功能。

2、UI模块

严重程度:地狱

使用NGUI作为UI解决方案的项目占据了较高的比例,但从趋势上来看,UGUI从2016 Q3开始,增速非常明显。通过进一步分析,我们发现近大半年来的新ARPG手游中,使用UGUI的项目显著增加,从而大幅提升了UGUI在ARPG项目中的使用占比。

下面我们将分别说明NGUI和UGUI的CPU耗时和堆内存占用情况。

UI模块的性能开销依然很高,也是我们统计中的第二大性能杀手。在中低端设备上,超过90%的研发项目在UI端都面临较为严重的性能问题,主要体现方面与MMORPG游戏类似,功能界面复杂、同一时刻需要更新的Panel多等。但ARPG的平均耗时要略低于MMORPG,这是因为ARPG主要仍以推图形式为主,其在战斗副本中的玩家是预先固定的,大量玩家同屏打怪的情况很少出现。

经统计,NGUI中堆内存每10000帧分配的主体范围为 6.0~81.7 MB,UGUI中堆内存每10000帧分配的主体范围在12.3 MB以内。从堆内存分配来看,UGUI远低于NGUI。

3、逻辑代码

严重程度:噩梦

1)GC触发频率很高,是造成卡顿的主要原因之一,目前只有12.5%的项目可以将GC的触发频率控制在1000帧/次以上。
2)在2017年GC平均耗时趋势虽有所上升,但相比于2016年已经大幅降低。

1)Instantiate实例化操作平均每次调用的CPU耗时主要分布在: 1.2~43.5 ms,且主要集中在10ms以内。
2)Instantiate实例化耗时在2017 Q2之后大幅下降,这说明越来越多的研发团队开始重视项目运行时的资源管理。

Shader.Parse 操作是比较突出的性能杀手,目前平均每次调用的CPU耗时主要分布在 4.4~145.2ms。但随着越来越多团队了解该项的耗时特性后,该项的CPU耗时呈现出较为明显的下降趋势。

4、动画模块

严重程度:噩梦

1)Animator.Update/Animation.Update的开销在中低端设备上的耗时普遍较高,但整体耗时在2017年上半年有明显的下降趋势。
2)ARPG游戏的MeshSkinning.Update的耗时明显高于MMORPG游戏。这主要体现在角色模型的面片数和骨骼数方面,ARPG更加偏向于动作表现力上。

5、粒子模块

严重程度:普通

1)粒子系统的CPU开销普遍较低,且近一年来下降趋势较为明显。
2)粒子系统的数量使用仍然较大,这样会造成较高的内存占用。UWA建议将粒子系统的使用数量峰值控制在400以下,目前仅21.8%的项目达到。

6、物理模块

严重程度:普通

物理模块的性能普遍较好,但呈现出较为明显的上升趋势,因此在中低端机上依然需要研发团队关注。

三、ARPG手游内存模块开销分析

内存泄露是研发过程中经常面临的严峻问题,依然有37%的项目存在不同程度的内存泄露。我们可以看到从2016 Q2开始,内存泄露占比大幅下降,但随着项目新功能的开发以及新项目的涌入,其占比又开始大幅攀升回来。虽然整体趋势有所下降,但内存泄露问题的有效防范和解决,依然任重道远。

1、总体内存

严重程度:地狱

1)总体内存峰值主要分布在95.6~573.9 MB区间,且均值在300MB以上。
2)与MMORPG游戏相比,ARPG内存占用的上线起伏更加明显。经过进一步分析,我们发现,2016 Q4的内存占用在大多数老项目中的主要资源(纹理、网格和动画片段等)都得到了较大的内存优化;但随着2017 Q1新项目不断涌入,内存占用又大幅回升;而2017 Q2内存的下降则是因为AssetBundle内存的大幅下降,大多数研发团队开始通过LoadFromFile来加载LZ4格式的AssetBundle,从而让内存又迅速回落。

2、总体堆内存

严重程度:地狱

1)总体堆内存峰值主要分布为 9.7~109.6 MB,仅37.7%的项目可以把总体堆内存峰值控制在40MB以内。
2)堆内存使用上升趋势明显,建议研发团队重点关注。对此,UWA建议重点关注以下几点:

  • 严格关注配置文件的使用,避免一次性加载过大的配置文件而撑大堆内存;
  • 不少项目的堆内存增大是由于热更新所致。因此,对于过大的数据Data的使用,建议通过分帧进行,并及时进行GC回收;
  • 避免不必要的代码堆内存分配,虽然是老生常谈,但从趋势上可以看出,大多数研发团队仍需加强重视。

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

3、纹理资源内存

严重程度:地狱

1)纹理内存峰值主要分布为 22.4~198.8 MB,且主要分布在50~100MB区间。
2)内存峰值占用在2016 Q4大幅下降,但在今年后又开始逐步上升,建议研发团队密切关注自身项目的纹理资源使用情况。

4、网格资源内存

严重程度:噩梦

1)网格资源内存峰值主要分布为 1.0~ 47.5 MB,且主要集中在40MB以内。
2)ARPG游戏的场景较之MMORPG游戏普遍较小,场景相对轻量和简单,因此,其网格资源量明显低于MMORPG游戏。

5、动画资源内存

严重程度:噩梦

动画资源内存峰值主要分布在38.7 MB以内,且主要集中在15MB以内。

6、Shader资源内存

严重程度:噩梦

1)Shader资源内存峰值主要分布在6.1 MB之内,且主要集中在1MB之内。
2)从内存趋势上来看,近一年来内存占用下降较为明显。

7、RenderTexture资源内存

严重程度:地狱

1)RenderTexture资源内存峰值主要控制在67.7 MB以内,且在各个区间都较为平均。
2)内存使用上升趋势明显,建议研发团队对其在自身项目中的使用情况特别关注!

8、粒子系统资源内存

严重程度:噩梦

1)粒子系统资源内存峰值主要分布在 33.7 MB以内,且主要集中在20MB以内。
2)粒子系统的内存占用一直较为平稳,虽然在2011年Q1期间高端机上的内存占用较高,但在2017年Q2则大幅回落到之前水平。
3)目前,粒子系统的内存占用仍然较为“虚高”,即游戏运行期间Active数量远小于内存中的总数量,在大部分项目中,Active的粒子系统数量占比不到10%,即粒子系统的内存占用峰值应该在5MB左右。

四、ARPG手游资源管理分析

1)在资源加载方面,AssetBundle.Load和Resources.Load是项目中的主要加载方式。
2)通过调用趋势可以看出,研发团队对于Resources.Load的使用仍然有明显的增长趋势。对此,UWA强烈建议研发团队尽可能使用AssetBundle作为游戏资源的主要加载方式。

1)LoadFromFile(Async)是ARPG项目中AssetBundle的主要加载方式。
2)LoadFromFile(Async)的使用在2017 Q2上大幅增长了46%,这是在UWA DAY 2017上我们非常建议的AssetBundle加载方式(Unity 5.3版本后),研发团队可以通过UWA Blog(http://blog.uwa4d.com)的相关文章查看具体的性能对比。

Instantiate/Destroy和Active/Deactive调用次数较高,需要研发团队根据自身项目情况时刻注意:
1)由于Active/Deactive每次调用的CPU开销不大,且不会造成崩溃、闪退等问题,所以研发团队极易忽视这两项操作所带来的性能问题,因而出现了游戏运行1万帧Active/Deactive上万次调用的情况。因此,此处存在着很大的性能浪费;
2)Instantiate/Destroy的调用次数同样较高,虽然不如Active/Deactive频繁,但每3帧调用1次Instantiate的频率依然不容忽视,建议研发团队坚持加强项目的资源管理,避免不必要的频繁Instantiate/Destroy操作发生。

五、UWA 对于ARPG手游研发团队的建议

一、警惕渲染模块和UI模块这两大性能杀手!随着精品化ARPG项目的日益增多,在日后很长一段时间内,这两项依然将是研发团队在性能优化方面的重中之重!

  • 渲染方面,Draw Call的控制技术已被越来越多的团队所熟练掌握,并且随着设备的发展,Draw Call的影响将越来越小,反观渲染Triangle数量将逐步成为渲染模块的新的性能瓶颈,越来越大的渲染Triangle量会给GPU、耗电和发热方面带来巨大的压力;
  • UI方面,UI网格重建开销在未来相当长的一段时间内仍然是研发团队头痛的问题,UI优化的原则非常简单:动静分离,但真实操作起来则是非常困难。90%项目中的UI性能问题是由于动静元素没有分离导致,但没有任何两个项目的具体原因是一致的。这是UI性能优化方面非常困难的主要原因。

二、逻辑代码方面,Instantiate实例化开销虽然在2017 Q2呈现较为明显的下降趋势,但仍需要研发团队持续对资源管理进行监控。同时,GC开销的上升趋势明显,需要研发团队加强对Mono堆内存的优化意识;

三、在内存优化方面,与MMORPG游戏类似,Mono和RenderTexture内存占用在2017年的上升趋势非常明显,对此,建议研发团队在接下来的项目研发中密切关注这两项的内存使用;

四、在动画模块方面,ARPG游戏的CPU耗时明显高于MMORPG游戏。对此,我们的建议如下:

  • 尝试动画片段的精度缩减技术,该技术在UWA Blog和UWA问答上(http://answer.uwa4d.com)都有详细的讲解和代码分享;
  • 由于ARPG游戏对于动作表现力的要求很高,因此,相比于Humanoid模式,Generic模式更加适合于ARPG项目,它可以让你的动画表现与3DMax、Maya等制作表现更加一致;
  • 随着ARPG中怪物角色的数量持续增加,GPU Instancing技术会受到更多游戏团队的青睐,具体做法可参加UWA Blog相关文章。但同样需要注意的是,研发团队需要控制同屏的渲染面片数。

五、资源加载方面,Resources.Load依然是比较主流的资源加载方式。但UWA建议尽可能尝试通过AssetBundle.Load来加载相关资源。在2017 Q2以后,LoadFromFile(Async)已经成为ARPG研发团队的主流AssetBundle加载方式,对于仍然没有使用该方式的研发团队,建议查看UWA的相关直播信息,并找到对应的性能比较和分析;

六、以上数据是我们对于ARPG手游性能数据的整体研究和趋势分析,旨在从宏观上为大家展现项目中普遍存在的性能瓶颈和研发团队容易忽视的潜在性能问题。但同样需要说明的是,优化是一个“抽丝剥茧”的过程,需要研发团队花费大量的时间和耐心去完成。UWA建议:多做测试,以数据说话,空杯心态,将经验归零。

以上就是UWA发布的2016-2017年ARPG手游性能测评汇总和分析。此次,我们从性能参数上增加了资源加载、资源卸载等数据扩充了报告的完整性,在测评参数上加入了机型、历史数据等方便研发团队能及时进行横向和纵向的比较。我们深信数据是会说话的,总有规律值得我们追溯求实、鉴往知来。同时我们也会不断细化评析的标准、划分,以使得这些数据更有代表性和说服力。

关于UWA

由侑虎科技开发的游戏/VR应用性能优化平台,目前提供 1)性能检测与优化 2)资源检测与分析 3)UWA GOT 三大工具。同时,我们也会为大家开发更省心的功能,希望通过它们可以减少开发者反复测试定位问题的时间,从而将更多的精力集中在项目开发和解决问题中,能为大家项目研发省下的任何一分一秒,都是UWA团队的骄傲。

UWA发布 | 2017 Unity手游体检蓝皮书 — ARPG篇的更多相关文章

  1. 知物由学|游戏开发者如何从容应对Unity手游风险?

    本文由  网易云发布. "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不 ...

  2. Unity手游之路<七>角色控制器

    Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...

  3. Unity手游引擎安全解析及实践

    近日,由Unity主办的"Unity技术开放日"在广州成功举办,网易移动安全技术专家卓辉作为特邀嘉宾同现场400名游戏开发者分享了网易在手游安全所积累的经验.当下,很多手游背后都存 ...

  4. Unity手游之路<十三>手游代码更新策略探讨

    http://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙,加上家里事情也多,所以blog更新一直搁置了.最近在项目开发上线过程中 ...

  5. Unity手游之路<二>Java版服务端使用protostuff简化protobuf开发

    http://blog.csdn.net/janeky/article/details/17151465 开发一款网络游戏,首先要考虑的是客户端服务端之间用何种编码格式进行通信.之前我们介绍了Unit ...

  6. Unity手游之路<八>自动寻路Navmesh之入门

    http://blog.csdn.net/janeky/article/details/17457533 在的大部分mmo游戏都有了自动寻路功能.点击场景上的一个位置,角色就会自动寻路过去.中间可能会 ...

  7. Unity手游之路<十二>手游资源热更新策略探讨

    http://blog.csdn.net/janeky/article/details/17666409 上一次我们学习了如何将资源进行打包.这次就可以用上场了,我们来探讨一下手游资源的增量更新策略. ...

  8. unity手游之聊天SDK集成与使用一

    手游中都有聊天功能,比如公会,私聊,世界聊天,那么找一个好用,功能强大的SDK的可以节省很多精力,帮助我们提高开发速度与游戏质量. 写本篇博文是为了方便使用这个SDK做聊天模块的程序,避免许多坑,我在 ...

  9. Unity手游之路<六>游戏摇杆之Easy Touch 3教程

    之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...

随机推荐

  1. 好一个Time_Wait状态(TCP/IP)

    首先简单介绍一下Time_Wait是个什么鬼: 在TCP/IP协议中,我们都知道有三次握手四次挥手的过程,先来一个简单的图: 各个状态和基本的过程想必了解过TCP/IP协议的人都清楚,本次介绍的主题只 ...

  2. Linux 登陆提示文字

    /etc/issue是从本地登陆显示的信息 /etc/issue.net是从网络登陆显示的信息 /etc/motd内容由系统管理员确定,常用于通告信息,如计划关机时间的警告等 每次用户登录时,/etc ...

  3. C#给图片加文字和图片的水印

    /// <summary> /// WaterMark 的摘要说明 /// </summary> /// 图片加水印 /// <param name="strC ...

  4. 269. Alien Dictionary火星语字典(拓扑排序)

    [抄题]: There is a new alien language which uses the latin alphabet. However, the order among letters ...

  5. [Training Video - 4] [Groovy] Function in detail

    Employee.log=log Employee e1 = new Employee() Employee e2 = new Employee() e1.name = "A" e ...

  6. NHibernate获取实体配置信息(表名,列名等等)

    // 注意这里有个&符号,并不是写错了,而是约定 就是这样写的ctx.GetObject("&SessionFactory") 这是官网地址http://nhfor ...

  7. Spring.net方法的替换

    .为什么有时候你再执行某个方法的时候比如某个操作 a.权限验证 b.任务执行 当我执行到这个方法的时候,我可以先验证权限,如果验证不通过则替换到另一个方法去执行 public class MyValu ...

  8. python 的输入和输出

    内置函数:raw_inpurt('place input') print getpass  隐藏输入密码 import getpass pwd = getpass.getpass("> ...

  9. 通过cat方式生成yum源

    cat >> /etc/yum.repos.d/centos7.repo << EOF[test-iso7]name=CentOS- - Mediabaseurl=http:/ ...

  10. 如何设置才能远程登录Mysql数据库

    可以在一台机器上访问另一台机器的MySQL,但是需要一些设置. 进入MySQL后,输入以下命令: GRANT ALL PRIVILEGES ON *.* TO 'tigase'@'%' IDENTIF ...