工欲善其事,必先利其器
对于项目中出现的闪退,卡顿等问题,我们需要有线索去进行分析,就像破案一样,根据现有的信息数据去分析并一步步找到**方案。
在Unity编辑器下,我们可以使用Unity Profiler来进行分析,而对于真机,我们可以使用Unity推出的方案-UPR。
关于UPR
UPR出现的原因
UPR是Unity于2019年提出的性能测试分析解决方案,Unity团队在分析市场上的工具后,发现他们存在这几个问题:
第一:数据不完整。大家都知道Unity是非常复杂的引擎。而且对大多数人来说,Unity是一个黑盒引擎,所以可能很多性能工具并不能告诉你究竟是引擎的问题?还是你自己的问题?如果是你自己的问题,那么该如何解决?
第二:就是碎片化严重。我们现在面对的平台非常多,有Android、iOS、Windows、Mac等各种不同的平台,每一个平台都有自己的工具链。
第三:数据角度的多样性。每一个工具的侧重点是不一样的,这个侧重点会导致你去观察一个问题的时候,看到的角度也是不一样的。可能出现一个现象:通过不同的工具分析同一个问题,得出不同的结论。
基于以上原因,Unity制作了基于Unity Profiler数据进行分析和增强新的工具:UPR。
UPR的优点
UPR主要拥有以下几个优点:
- 全面
- 零入侵
- 极速
- 易用
- 免费
全面
UPR的数据来源于Unity Profiler数据 ,并且能够展示Unity Profiler未曾展示的详细数据。他有着更多的比较维度和追踪角度,能给玩家更多的参考建议。当然他是支持主流平台的,如Android、iOS和Windows等。
零入侵
UPR使用上非常方便,不需要嵌入SDK,也无需改动项目配置,不会对整个测试流程和工作流程造成影响。笔者在第一次使用UPR时,被他的便利性所震惊。
极速
UPR的数据是实时传输和分析的,意味着测试结束之后无需进行等待就能获得测试报告,并且其报告页面立等可取,永久保存。
易用
UPR无需开发人员介入,只需要打出Development Build的包,测试人员即可对其进行测试分析。
免费
对于大众用户UPR是完全免费的。
UPR的使用
UPR的使用包括两个部分:UPR网页端的使用及UPR设备端的使用。
UPR网页端的使用
- 登录UPR网址,并登录
- 点击现在开始使用
- 接着创建项目,填写项目信息,其中最重要的是Unity版本号和项目包名要和你打出的包一致
- 接着创建测试,填测试相关信息,其中最重要的是Unity版本号和项目包名要和你打出的包一致
- 打出一个Development Build的包,以及在测试设备上开启悬浮窗权限
- 在测试设备上下载UPR手机端,并扫描创建测试后出现的二维码即可
UPR手机端的使用
- 在手机上下载UPR的App
- 扫描之前在网页端创建测试时出现的二维码
- 点击App上的启动游戏按钮。(注:Unity 2017.3之后的游戏请确认在点击启动游戏按钮之前,游戏不处于运行状态(包括后台)。)
- 此时在左上角可以看到UPR的悬浮窗口。
点击**▷ 按钮开始测试。
点击+ 按钮记录场景标签。
点击???? 按钮记录对象快照。
点击▢ **按钮停止测试。
- 结束测试后即可到UPR网站上查看结果
UPR报告概览
概况面板
概况面板中主要是显示整个测试的大致情况,其中包括了各个参数的峰值,及耗时高和GC高的函数排序。对于超出官方建议的值,报告中会标红。
其中包括了平均帧率、ReservedMono峰值(Unity向系统申请的总内存)、纹理资源峰值、网格资源峰值、动画资源峰值、音频资源峰值、DrawCall峰值和Tris峰值(三角形数量峰值)。
CPU面板
CPU面板主要显示了渲染、逻辑脚本和物理计算的CPU耗时,数据分类包括了其均值及帧占比。
点击其中的某一帧即可显示对应帧的数据,点击表格右上的区域操作按钮可以划选想要细看的区域。
在CPU细节子面板中,我们通过点击某一帧来查看当帧的CPU耗时详情,我们可以通过分析耗时高的函数来判断项目现在卡顿的问题并找出优化方案:
图形面板
图形面板中主要显示了GPU渲染相关的一些参数,如SetPassCalls、DrawCalls、顶点数、三角面数、显存、VBO Size、VBO Count以及图形合批的情况,其中包括了这些参数均值和峰值,我们也可以通过点击某一帧来显示当帧的数据。
Set Pass Call是指GPU改变渲染状态的指令,例如GPU在渲染完一个模型时,其渲染状态相对于上一个模型发生了变化,则会调用SetPassCall。
Draw Call则是CPU通知GPU使用最近的SetPassCall来渲染指定的模型。
VBO指的是Vertex Buffer Object,其用于保存顶点的数据 ,他可以包括顶点的位置、颜色、法向量等数据。
动/静态批处理指的是Unity通过将材质一致并符合其标准的物体合并在一个批次进行渲染的技术,具体可见:https://docs.unity3d.com/Manual/DrawCallBatching.html
内存面板
内存面板中显示了项目中托管堆(Reserved Mono和Used Mono)的内存均值和峰值,以及Unity引擎资源(Reserved Unity和Used Unity)的内存均值和峰值。
在资源细节子面板中我们还可以看到纹理、网格、动画、音频和材质资源的各个细节。我们同时也可以通过对象快照(测试时,点击???? 按钮记录对象快照),来查看我们采样那一帧的详细的内存分布:
硬件面板
硬件面板主要显示了电量与温度在测试过程中的变化。
热点数据面板
主要显示了SkinnedMesh和Geometry数据在测试过程中的变化。