有可能是国内最好用的unity性能分析工具
有可能是国内最好用的unity性能分析工具
据说90%的高颜值工程师都在等待“她”的出现。反正也没人约你,不如主动出击、来试试我们这个产品?2015年11月11日之前,我们祝你脱单。
首先感谢你的到来,这的确一个是业内非常期待的工具类产品,无论你是否正在从事unity相关的工作,听我们讲完这个良心产品的故事保证会让你增加58%的魅力值。
言归正传,这一次、我们仍然朝着解放你右手的方向前行,但在此之前,先要看看你的“性”能到底行不行?
(下文有大量专业术语,有可能引起您的不适,请在家长指导下阅读。)
一.常见的unity手游性能问题有哪些?
unity手游的性能问题一直是被视为诟病,公司TDR评审中已经见过很多,先列出几个口头上说的比较多的问题:
64位unity游戏内存过高,撑不了几局就爆了;(所以说持久才是关键)
CPU过高造成卡顿;
Drawcall太多、导致卡顿;
mono内存泄漏;
上面几个是常见的问题本质, 那它们对游戏的具体影响是什么呢?就拿最近比较火的《全民超神》来举例,我们有幸参与了它上线前后的几个优化版本的分析,先后遇到的负面影响和优化方法主要有下面几个:
帧同步导致的卡顿,用CS同步来替代,并且进行数据包的合并与优化;
频繁创建和销毁的小兵对象让CPU开销很大,采用高效对象池进行优化;
在玩家视野外的不必要的特效和渲染可以全部关闭,降低了CPU和GPU开销;
在高中低三档机型上玩游戏时,分别加载不同层次的特效包,这也有助于降低cpu和内存的开销;
发现副本内wwise音频组件占了30%的cpu时间,果断抛弃之,采用unity自带功能,优化很明显;
副本内每帧200以上的Drawcall导致中低端机型有明显卡顿,最终抛弃了NGUI,重写了一套紧密结合自身特性的GUI,搞定!
上面问题全部解决掉后,如果内存还是偏高怎么办?请看下面这张图,我们能继续帮你细分出各种资源的内存占用量。
我们协助全民超神先后做过五轮5v5玩法的性能分析,拿最早的版本到稳定版本来对比的话,Native重复资源对象从43M减少为20M,优化了53%,关卡间切换保留的资源从7.8M减少为约4M,优化了49%;副本进入后大约15秒左右,因为大量GC导致的FPS过低问题也已经搞定。
二.Unity cube 能干什么?
一句话概而言之:让用户以最小的成本在真机上进行游戏性能深度分析。
是不是经常有一个疑问在闹边盘旋,不用工具行不行?当然行,并且你的产品照样能发布、能上线,但生病后怎么办,还得老老实实的去看病去吃药;冰冻三尺非一日之寒, 一场大病的费用远比日常保养要贵的多,对应的测试名言就是“bug发现的越早、修复成本越小”。
常见的游戏质量改进的过程如下图,我们能帮你完成的是前两个环节,至于第三步、解决问题当然还是要开发人员去改代码了。
打个广告、让你没有一丝丝防备。。
三.Unity cube 功能介绍
目前市面上大多数性能工具都还停留在操作系统级别的数据上, 在游戏自身的分析上似乎还缺少点什么,所以我们觉得还可以往灵魂深处挖一挖 –-- 基于引擎做点什么。
- 功能介绍
通过Unity Cube的APP启动游戏,正常退出游戏后再上传结果,然后到cube的主页上查看刚才游戏的数据分析结果。APP在游戏过程中进行多种数据的提取,包括cpu、内存、drawcall、mesh、AnimationClip、AudioClip、texture2D、堆栈、函数时间、对象生命周期 等。(不断增加中)
在资源分析纬度上,我们能给出如下结论:
资源使用量是否在合理范围之内。
一个场景内的资源重复率。
资源对象拷贝的数量是否合理。
场景切换时保留的资源详情。
在性能分析纬度上,我们能根据高中低三档机型自动的给出不同参考值:
场景内FPS变化趋势。
场景内CPU变化趋势。
CPU和FPS在性能低谷时的函数开销排名。(逻辑函数和GC)
mono内存的分配趋势。
每帧的drawcall 次数。
作为科普性软文,还是有必要对以上数据进行简单的解释一下。
我们能在一次测试过程中,看看各项资源使用是否在合理范围之内。例如某个射击游戏在纹理(texture)内存的占用较高,峰值达到了88.5MB,这时我们就需要建议研发团队来进行纹理部分的优化。
在FPS或CPU 低谷的时间点,我们对分析了较高CPU占用的函数排名,开发团队能够根据这些信息快速定位到相关模块,有的放矢的改进和优化。
游戏运行过程中(特别是战斗场景内),垃圾回收(Garbage Collection)的调用次数和执行时间,很大程度会影响游戏运行的流畅度(卡顿),根据数据信息能帮助开发团队更好的去优化代码。
在场景切换时被长期保留下来的资源中,有一部分是因为没有及时被释放而被保留了下来,占用了多余了内存;我们列出了这部分冗余资源,让开发人员清楚的看到哪些资源是没有被及时释放的。
- 同类工具对比。
MAT (Memory Analyzer Tool)的缺点:
需要导入HPROF文件再分析;
只能查看java层的内存情况,看不到native堆的详情;
xcode instrument 的缺点:
只能用于mac,ios;
只能查看C++ 或 object C 的情况,看不到mono堆的详情;
Unity Profiler 的缺点:
需要单独编译develop版本;
在PC上执行,没法捕获真机数据;
内存数据跟实际真机的数据差异很大、多的时候有几十M差距;
只能看到最近一段时间的数据,看不到总体的详情;
自己的缺点当然也是一个不可回避的问题,目前我们在开发计划中功能还包括:渲染三角形数量、渲染texture数量、对象引用关系等,在重度性能分析过程中对FPS略有影响,因为我们会提取每一帧的函数堆栈信息,数据量比较大。
- 逻辑架构图
这里也不多说什么了,一张简单的架构图而已,满足下技术控的偷窥欲望。。
- 什么?你不熟悉unity?
没关系,这个已在我们的预料之中,我们为你准备了不同的结果展示页面。
对于unity比较陌生的用户,你只需要看总结概述页面即可,页面上会列出所有问题的总结。
对于unity大神和开发人员,你更关心的应该是详细的性能数据,都能满足你们。大神说“我更喜欢看着unity profiler直接调试啊”,那你还得腾出时间编译一个develop版本、还得重新跑一遍游戏、数据和真机还相差很多,关键是大神哪来那么多时间。。
- 提高工作效率
答案是肯定的,工具本身就是为提高生产效率而存在。
我们常见的质量改进流程有下面这四步:
1) 性能测试时发现问题;
2) 提bug 给开发人员;
3) 开发人员编译develop版本;
4) 开发人员用unity profiler 定位原因;
用unity cube进行游戏测试能帮你省掉后面2个步骤,何乐而不为呢?
通常情况下、开发人员是间隔几个星期甚至几个月才会去做一次性能调优的工作,中间已经隔了N个版本,有很多问题会被埋的很深;基于“问题发现的越早修复成本越小”的硬道理,功能测试人员完全可以用unity cube进行日常工作,让它在身后默默为你发现问题。
四.优化native heap的N种方法
作为一个以性能优化为己任的工具类产品,我们不仅致力于问题的发现和定位,性能优化的若干方法也是我们日常唠嗑的内容之一。
贴图:
控制贴图大小,尽量不要超过 1024 x 1024;
尽量使用2的n次幂大小的贴图,否则GfxDriver里会有2份贴图;
尽量使用压缩格式减小贴图大小;
若干种贴图合并技术;
去除多余的alpha通道;
模型:
尽量控制模型的面数;(废话…)
动画:
N种动画压缩方法;
尽量减少骨骼数量;
声音:
采用压缩MP3 和 wav;
资源方面的优化:
使用 Resource.Load 方法在需要的时候再读取资源;
各种资源在使用完成后,尽快用Resource.UnloadAsset和UnloadUnusedAsset卸载掉;
灵活运用AssetBundle的Load和Unload方法动态加载资源,避免主要场景内的初始化内存占用过高;(实现起来真的很难…)
采用www加载了AssetBundle后,要用www.Dispose 及时释放;
在关卡内谨慎使用DontDestroyOnLoad,被标注的资源会常驻内存;
五.页面截图
六.小结
俗话说:用户体验不谈性能就是耍流氓。 在PC游戏上的性能问题并没有那么明显, 加个内存换个cpu或者刷个主频就能轻松搞定;到了手游时代后情况则显得比较严峻,捉肘见襟的内存让资源加载时就像如履薄冰,加上高中低不同配置的机型更加让性能问题显得很突出,一个低端机型上的卡顿就可能造成一大批屌丝用户的流失,这当然无法被忽视。
性能优化就像海绵中的水、又或是内衣里的肉,挤一挤总会有的。同时、性能优化并不是一劳永逸的工作,项目的各个阶段都会有性能上的问题,在用户体验的基础上持续进行打磨,持续保持产品的良好性能才能赢得好口碑。(和保持身体健康是一个道理)
Unity游戏的性能优化过程更像是一门时空转换的艺术, 持续在cpu和内存之间取得一个平衡。空间不足时则需要释放一些无用数据,以获得更优的空间使用率;时间太长时就需要降低不必要的函数开销。例如在低端机上,为了节约有限的内存空间,静态加载的资源会相对较少,很大一部分资源通过动态加载和释放;而在高端机上则不用考虑空间的限制,可以一次性静态加载更多的资源,省去了不少loading和GC的工作,让游戏体验更加流畅。
产品下载:http://pub.code.oa.com/project/home?projectName=UnityCube
产品相关欢迎联系RTX:youngxue、senxu
我们致力于打造一个最完美最好用的unity性能工具 --- The Cube