【译】使用仪器进行分析

发表于2016-02-28
评论3 1.1k浏览

在企业支持团队,我们看到了很多的iOS项目。某些时候任何的iOS开发时,开发人员通常结束运行他们的游戏,然后坐在那思考“为什么这个运行这么慢呢?”通常有一些好的工具能分析它的表现情况,其中最好的一个是仪器。仔细阅读下去,找到如何使用它来发现你的问题!

要使用仪器,或者是任何的XCode调试工具,你将需要针对iOS构建目标构建一个Unity项目(将开发构建和脚本调试选项设为unchecked)。然后你需要在发行模式里使用XCode编译生成XCode项目并将其部署到连接的iOS设备。

启动仪器(通过长按播放按钮或者选择产品>配置文件)后,选择时间分析。在开始运行分析时,先从应用程序选择器中选择内置应用,然后按红色录制按钮。当仪器连接上后应用程序将会在iOS设备上运行,时间分析也将开始记录遥测。这个遥测将以蓝色曲线图出现在仪器的时间轴上。



PS:清理调用层次,在“设置”子菜单中(点击细节窗格中的齿轮图标),调用树状图的右侧细节窗格有两个选项。选择展平递归和隐藏系统库。 

方法调用的列表将显示在仪器窗口的细节部分。每个顶级的方法调用代表应用程序中的一个线程。 

一般情况下,主要的方法是所有感兴趣的热点的位置,因为它包含了所有的托管代码。 

扩大主要方法将产生方法调用的深树。主要分支是两种方法:

· [startUnity]和Unity装载应用(这些方法名称有时会出现全部大写)。
· PlayerLoop

[startUnity]很有趣,因为它包含初始化Unity引擎的所有时间。在其之下你可以发现一个名为Unity装载应用的一个方法。在Unity装载应用下,启动时间就可以被分析了。



  一旦你在应用分析时发现一个很好的时间片,暂停分析,并开始扩大树。当你继续向下分析调用树时,你会发现在左边.d栏里时间在以毫秒的速度减少。你要找的是导致时间显著减少的项目。这将是一个性能热点。一旦你找到一个,你可以回到你的代码库,并​​找出WTF花费这么多的时间运行的原因了。这可能是因为它是完全必要的操作,或者它可能是在遥远过去的一段时间,你砍掉一些生产前的代码使得它交给你的生产项目,或者...噢..有一万个理由证明它是真的。你是否决定/决定如何修复这个热点可能在很大程度上取决于你,你比谁都清楚的知道你的代码库:D。

   仪器也可用于寻找广泛分布的性能点- 缺乏一个单一的大的热点,但显示为在一个代码库的许多不同地方丢失了几毫秒的时间。要做到这一点,无论是键入部分或完整的函数名到仪器符号搜索框,位于调用树的上方和右侧。如果分析游戏的一部分片段,扩大PlayerLoop和折叠其下的所有方法。如果分析的启动时间,扩大UnityLoadApplication和折叠其下的方法。浪费在一个具体操作上的毫秒的总数可以通过查看在PlayerLoop或UnityLoadApplication花费的总时间,并减去位于自柱的毫秒数。

寻找的常用方法:

· “Box(”,“box”和“box” - 这表明,将C#的值放入盒中的行为正在发生;装盒的大多数情况下都是一般固定的

· “Concat” - 字符串连接往往容易被优化掉

· “CreateScriptingArray” - Unity中所有的API返回数组将分配数组的新副本。尽量减少这些方法的调用。

·  “Reflection” - Reflection是缓慢的。使用这个来估算进入计算的时间并消除它所有可能的情况。

· “FindObjectOfType” - 使用此来查找FindObjectOfType重复或不必要的调用或其他已知Unity缓慢的API。

· “Linq” - 检查创建和丢弃Linq查询的时间;考虑手动优化的方法代替热点。 

  还有分析CPU时间,仪器还允许你分析内存使用情况。仪器的分配分析器提供了两个详细视图到应用程序的内存使用情况的探头。该探头分配一个特定的时间跨度中允许的对象驻留内存中的检查。虚拟机跟踪探针允许监测垃圾内存堆大小,这是一种iOS用于决定应用程序必须强制关闭的主要指标。 

  在选择仪器的配给分析时,这两个探测器将同时运行。像往常一样,首先按下红色录制按钮运行分析。

   要正确设置分配探头,确保仪器右侧的Detail标签中以下的设置正确。在显示设置(中间的选项)下,确保分配寿命设定为Created & Persistent。在录制设置(左边的选项),确保释放的内存丢弃事件被选中。

   对检查内存行为的最有用的显示的是统计显示,当使用分配探头时这是默认的显示。这个画面显示了一个时间轴。当使用推荐的设置时,该图显示的蓝线指示的时间和当前仍活跃的量级内存分配,通过看这个图的内存分配的大小,你可以通过简单重复的测试方案查看一直活跃的或泄漏的内存,来确保没有蓝线运行仍然活跃。

   另一个有用的显示是调用树显示。它显示了分配执行中的代码行,用一行代码代表内存消耗的数量。

   下面你可以看到所测试的应用程序的总内存使用量的25%左右完全是由于着色器。鉴于着色器‘在装载线程中的位置,在应用程序启动时载入时都必须是默认Unity项目随附的标准着色器。



  和以前一样,一旦你已经确定的一个热点,你用它做什么完全依赖于你的项目。就是这样,一个简短的仪器指导。 1000词(ish),没有顶尖团队的证明。我们不想陷入像上次那样的麻烦。侵犯版权是不好笑的。企业支持团队创造更多的这些指南,我们将在未来几个月贴出我们的最佳实践指南的完整版本!我们喜欢一起完成一个计划的感觉。

  翻译自: 《PROFILING WITH INSTRUMENTS / http://blogs.unity3d.com/2016/02/01/profiling-with-instruments/》

原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引