七个要素帮你打造现象级手游!优化程度堪比《QQ飞车》

欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ios

本文由 WeTest质量开放平台团队 发表于 云+社区专栏

做者:申江涛,腾讯互娱客户端工程师算法

商业转载请联系腾讯WeTest得到受权,非商业转载请注明出处。数组

WeTest 导读

加入项目组的这段时间主要是承担性能优化这块的工做,同时也会去实现一些场景材质、特效材质以及工具。今天就性能优化这块分享一下我的的经验。缓存


设备等级划分

设备等级划分是一切优化,LOD策略的前提。性能优化

最新的iPhoneX A11 GPU性能直逼笔记本的集成显卡,要照顾三四线的小朋友,红米1你也得想办法支持。网络

画质选项高中低,游戏第一次启动经过设备硬件配置将设备匹配一个默认画质,匹配依据能够按照CPU,GPU,内存等,也能够根据游戏类型作一些特殊处理,每一档选个表明机器,CPU,GPU性能最好心理有数,能够参考下CPU的天梯1和GPU的天梯2,想拿详细数据的本身写测试案例跑。数据结构

默认画质匹配最好是基于配置文件的,这样即便上线后发现匹配规则有问题或者设备更新换代了想优化匹配规则也能够动过热更来刷新。多线程

为知足美术大大们的追求,能够在高画质的基础上再划分一个超高配。机器学习

设备等级划分以后,就能够作一些LOD策略了,必定要作的就是划分各类特效的级别,其次场景最好也作一下,有条件的UI元素也作一下,对于非核心信息的UI能够在低配机隐藏。tcp

关于Shader LOD的作法有在这个回答5里面提到,这里就不赘述了。

优化工具

磨刀不误砍柴工,熟练掌握profile工具绝对是打开优化之门的第一步。

Unity Profile


imgp1.jpg

做为最简单也是最实用的Profiler,即便是不作优化的同窗也最好学会如何使用。它可以很是方便地分析出当前的CPU热点。

不少萌新会遇到没法手机连Profiler的问题,若是你也遇到了,请肯定下面几个点(假设连Android手机)

1. 手机是开发者模式,且在cmd中输入adb devices能看到本身的设备

2. 配置了Android SDK

3. 编译的是develop build版本

4. Unity当前是Android工程

5. 若是不是在本机构建的,须要在cmd中输入 adb forward tcp:54999 localabstract:Unity-xxxx , xxxx是游戏的包名。

新版本Unity集成了FrameDebugger 和新的内存快照工具,更方便了。

在不开Deep Profile的状况下,看到的消耗比较粗略,很难定位具体的消耗,打开DeepProfile能看到比较深的函数堆栈,可是会有一些消耗,不过在能够接受的范围以内。

移动设备上无法开Deep。

一般遇到的一个问题是手机上的Profile结果和PC上的结果不一致,解决方案以下

一切以移动设备为准,但愿详细定位的话能够选择用Profiler.Begin打桩,或者在PC上开Deep Profile找到对应的位置,展开详细的堆栈来定位。

Adreno Profiler


imgp2.jpg

蛮好用的一个Android平台的GPU Profiler,以前不少人用来提取手游的资源,可是已经被高通抛弃了,已中止更新支持一些老的高通GPU的设备,这边肯定好用的是红米 Note 1.

若是能找到能够用的设备能够,建议仍是能够连一下看看,仍是能看到不少东西的:DC数量,绘制顺序,渲染shader,动态修改shader看效果,贴图格式…

这个东西除了看性能还能够用来查一些平台相关的渲染错误。

XCode


首先你要有台Mac以及不算太老的ios设备。

首先要去Apple 申请一个免费的开发者帐号,而后从Unity构建一个Xcode工程,连上真机运行。

imgp3.jpg

相对于Adreno, Xcode显得专业不少,功能更增强大,最重要的是,能够看渲染耗时!这对于分析GPU热点很是有帮助。

CPU时间显示一直为0,不知道试Unity的bug仍是XCode的Bug。

Instrument能够看函数耗时。

备选

--

Mali Graphic Debugger:只能用于Mali的GPU, 看上去很厉害,4.X历来没有链接成功过, Unity5.X的集成稍微友好一些,尚未深刻研究。

Snapdragon Profiler:很卡,只能用于高端机,只能用于Android 6.0以上的系统,年末出了新版本,还能够。

Unity Frame Debugger:5.X以上才有,很方便,没详细研究。

WeTest - UPA:和Unity官方合做的客户端性能测试工具,无需ROOT和接入SDK,挺方便。

优化流程

若是想在后期轻松一些,美术的规范必定要定好,同时要有配套的资源检测,扫描工具。在定一些大的技术方案以前,各项消耗尽可能作到心理有数,若是不肯定就作一些实验,数据不会能骗人。

遇到上线前三天发现游戏只有十几帧的,这就只能砍效果了。

程序ic方面主要是对C#的语言底层机制的熟悉程度以及对数据结构的理解,一些明显有性能问题的写法要规避。

项目上线前两周左右就要开始对版本进行一些性能评估。高中低三档机的帧率,内存,耗电等都须要有数据。接下来就是

发现热点 -> 优化 ->继续发现热点->继续优化 –>继续…

这个过程确定是无法由优化的人一我的搞定,最好是进行完一轮Profile以后,把须要优化的点记录下来,而后经过tapd等工具将优化任务派给对应的美术/程序同窗,并去推动优化迭代,这其实牵涉到不少沟通工做。

关于GC

GC方面的优化很重要,原则就是任何大于20B的GC都值得被注意。GC的优化比较琐碎,也比较考验基本功。

除了最简单的避免使用foreach,避免频繁new内存,ToString。下面几个点多是每每容易被忽略。

  1. GameObject.SetActive会引发GC

优化方法:对于渲染相关的,能够考虑是否隐藏MeshRenderer来替代,还有就是把GameObject拉到很远的地方,UI也一样适用。

  1. C#自带的排序有GC

优化方法:本身实现排序算法,数量很少的直接写个简单的冒泡就行。

  1. 反射会引发GC

优化方法:大部分的反射均可以用dictionary作缓存。

  1. List.Add会有GC

优化方法:List底层是数组,在数组容量不够的时候就会扩充,会产生GC。能够考虑在new的时候直接指定大小。

  1. Box Unbox 会有gc

Boxing的GC很隐藏,打桩也很难发现,Boxing的触发条件:当须要将栈(Stack)上的值类型转换为堆(Heap)上的引用类型,这个过程被称为“装箱”,它具备如下特性:

  1. 在堆(Heap)上分配空间
  2. 通知垃圾回收器有关新对象的信息
  3. 复制值类型对象中的数据并传递给新的引用类型对象

当初是发现了Behavic组件底层有GC,跟到很下面的时候发现是一个equal函数

里面有一处改动是这样。

imgp4.png

GPU优化

不说GPU占有率,直接说GPU耗时Xms就是耍流氓。

一般XCode里面有GPU时间,对于一个30fps得游戏,理论上GPU有33ms的时间能够用,可是这个时间超过20ms的时候,就会发现再往上增长一些渲染消耗(1,2ms左右),GPU耗时不会明显增长,而原有的一些渲染消耗可能要1.5ms的你会发现只要1ms就能够了,这个时候其实GPU负载已经有点过了,GPU为了流畅度开始提高频率(iPhone 6 plus亲测)

imgp5.png

GPU的优化其实就是和美术同窗Battle的过程,找到那个平衡点,就算优化成功了。不少时候GPU的优化不只仅是Profile看热点,而是须要你给出方案,这就很看经验了,萌新须要多问问老司机。

下面几个点必定要注意!

Overdraw! Overdraw! Overdraw!注意每一块半透明是否须要渲染,面积是否可以减小。

Shader的复杂度会影响fillrate。

游戏场景内最好不要出现alpha test,会影响Hidden Surface Removal(HSR)的处理。

不要轻易尝试后处理,耗CPU, 耗内存, 耗GPU,中低配必定要关掉。

粒子系统请慎重使用,耗CPU,多Overdraw,数量和粒子总数都要控制好。

Static Batch 会消耗内存。

Dynamic Batch耗CPU,可是当须要渲染不少个一样的MeshRenderer的时候,对于减小DC很是有效,建议开启。

单局外的性能也要注意!

耗电优化

当优化完卡顿问题以后,本人就开始想着作一些炫酷的事情了,好比更酷的特效啊,后处理加起来啊,而后对于移动平台来讲,你不是不卡就能够了,耗电,发热也是要重点考虑的事情。

耗电的几个大头,GPU,网络,CPU,GPRS,喇叭,屏幕亮度等等。上面介绍了几个Profile CPU, GPU的工具,可是电量怎么Profile呢?

关于耗电的优化踩过不少坑,参考网上能找过的方法挨个试了,好比用ios设备的记录耗电状况日志,或者是XCode的Energy impact等等,通通无效,其中的坑就不一一说了。只说一个绝对有效的方法。

使用WeTest云真机耗电量测试!基于自家的耗电盒子来检测电量,测得的结果精准。

imgp6.png

还有就是设备一直处于充电状态,和实际使用有误差,不过都在可接受范围内。

首先要测试出一个同品类游戏或者标杆产品的耗电水平,好比测得王者5v5单局得耗电以下:

imgp7.png

接下来就能够测本身得apk了,测试得时候,最好能够经过做弊指令去动态开启关闭一些特性,获得各项的消耗,想要测得比较精确的结果就屡次测取平均。

获得各项的消耗以后,就能够有针对性的优化了。

数据上报统计

数据上报统计是指将玩家的设备信息,设备画质选择,帧率信息进行上报,这样每次测试都能获取到不少有用的信息,利用这些信息能够进行相应的调整,好比说某些默认画质匹配占比,不一样设备的性能表现,各种硬件的占比,比较卡顿的场景有哪些等等,同时也能够横向对比看优化的效果。

小结

记得刚加入团队,飞车恰好要进行第一次轻度测试,那次测试的收到不少的玩家抱怨各类卡顿,竞速赛卡,道具赛卡,连咱们的策划同窗在跑单人单局的也以为卡…当时为了保证流畅把大部分的机器归为了低配机,还有不少玩家,设备是中高配的,为了开上高帧率,将画质设为低…..

到PR2的时候,通过一轮强力优化,也是和美术策划同窗的通力合做,将默认中高配的设备从20%多提高到了70%以上,对于低配机,咱们尽可能会知足30fps流畅运行,对于中高配,60帧的顺畅体验可让他们以为玩的是另外一个游戏(Android设备须要开始多线程渲染),现在正式上线,在TapTap这种黑腾讯游戏即政治正确的社区,好评也是绝大多数。

不过仍是会有一些没有优化到的地方,好比

”Android 机开局的完美起步会卡啊!“

“-请期待年前的版本”

”休闲区仍是很卡啊!“

“-请期待年前的版本”

”新手引导品质过低了吧!“

“-请期待年前的版本”

….

优化是件漫长的事情,由于总有能够优化的东西,这里的面是否是能够更省,那边shader精度减一下是否是能够…..自身也须要去掌握多种的profile技术,内功也要增强修炼才行,你拿着消耗去和美术大佬谈判,总得给个靠谱的解决方案吧。

对于一个老司机,应该在项目之初就可以把各个标准都定好,给出最好的解决方案,能作的不能作的都和大佬拍好,这样后面就舒服一些,但大部分仍是一边现问题一边处理,而后慢慢地把规范和自动化测试流程搭建起来,这样也不失为亡羊补牢,这里面其实又涉及了一些TA工做。

特别感谢在优化过程当中可以耐心给我解答问题的各位前辈,很是感谢!

篇幅缘由,能覆盖的就这些了,没有涉及到的或者有误的迎你们指正。

参考

1 手机CPU性能天梯图

2 Smartphone and Tablet Graphics Cards - Benchmark List and Comparison

3 mobile cpu上禁用alpha test的相关总结

4 iOS Hardware Guide

5 Unity移动开发如何依据性能选择shader? - 拳四郎的回答 - 知乎

问答
游戏体系结构
相关阅读
团战开黑必备“良药”了解一下!
不再用担忧网吧开黑队友听不清了!
3行代码,为QQ轻游戏加上语音互动能力
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由做者受权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

相关文章
相关标签/搜索