使用仪器进行分析

IAND / UNITY TECHNOLOGIESContributor
Feb 1, 2016|6 Min
使用仪器进行分析
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

企业支持团队中,我们看到很多 iOS 项目。在任何 iOS 开发过程中的某个时候,开发人员经常会在运行他们的游戏时坐在那里想“它为什么运行得这么慢?”。市面上有一些很棒的性能分析工具,其中最好的一个就是 Instruments。继续阅读,了解如何使用它来查找您的问题!

要使用 Instruments 或任何 XCode 的调试工具,您需要为 iOS Build Target 构建一个 Unity 项目(未选中 Development Build 和 Script Debugging 选项)。然后,您需要在 Release 模式下使用 XCode 编译生成的 XCode 项目并将其部署到连接的 iOS 设备。

启动仪器后(长按播放按钮或选择“产品”>“配置文件”),选择时间配置文件器。要开始分析运行,请从应用程序选择器中选择构建的应用程序,然后按红色的“记录”按钮。该应用程序将在连接仪器的 iOS 设备上启动,并且时间分析器将开始记录遥测。遥测数据将以蓝色图表的形式出现在仪器时间线上。

blogpic

P.S.要清理调用层次结构,请按详细信息窗格左下方的 “调用树” 按钮以显示选项,然后选择 “展平递归”“隐藏系统库”

图像

方法调用列表将出现在 Instruments 窗口的详细信息部分。每个顶级方法调用代表应用程序内的一条线程。

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

扩展主要方法将产生一个深层的方法调用树。主要分支位于两种方法之间:

  • [startUnity] 和 UnityLoadApplication(这些方法名称有时以全部大写的形式出现)。
  • PlayerLoop

[startUnity] 很有趣,因为它包含了初始化 Unity 引擎所花费的所有时间。在其下方会发现一个名为 UnityLoadApplication 的方法。在 UnityLoadApplication 下可以分析启动时间。

image00

一旦您对应用程序的时间片段进行了良好的分析,请暂停分析器并开始展开树。当您沿着树向下工作时,您会注意到左侧列中以毫秒为单位的时间减少了。您正在寻找的是可以显著减少时间的物品。这将是一个表演热点。一旦找到一个,您就可以返回到您的代码库,并找出到底发生了什么,为什么花费了这么多时间。这可能是一项完全必要的操作,也可能是你在遥远的过去破解了一些预生产代码,并将其转移到你的生产项目中,或者......好吧......实际上可能有一百万个原因。是否或如何决定修复这个热点在很大程度上取决于你,因为你比任何人都更了解你的代码库。:D

仪器还可用于寻找广泛分布的性能瓶颈——那些没有单个大热点,但却在代码库的许多不同位置显示为几毫秒的丢失时间。为此,请在仪器的符号搜索框中输入部分或完整的函数名称,按 ⌘F 或单击 编辑 菜单中的 查找/查找... 即可显示。如果要分析游戏的某个片段,请展开 PlayerLoop 并折叠其下方的所有方法。如果分析启动时间,请展开 UnityLoadApplication 并折叠其下方的方法。通过查看 PlayerLoop 或 UnityLoadApplication 中花费的总时间并减去位于自身列中的毫秒数,可以粗略地估计在特定操作上浪费的总毫秒数。

常用查找方法:

  • “Box(“、“box” 和 “box” — 这些表示正在发生 C# 值装箱;大多数装箱实例都是固定的
  • “Concat”——字符串连接通常很容易被优化掉
  • “CreateScriptingArray”——所有返回数组的 Unity API 都将分配数组的新副本。尽量减少对这些方法的调用。
  • “反思”——反思是缓慢的。使用它来估计反射所损失的时间并尽可能地消除它。
  • “FindObjectOfType” - 使用它来定位对 FindObjectOfType 或其他已知缓慢的 Unity API 的重复或不必要的调用。
  • “Linq”——检查创建和丢弃 Linq 查询所浪费的时间;考虑用手动优化的方法替换热点。

除了分析 CPU 时间之外,Instruments 还允许您分析内存使用情况。仪器的分配分析器提供了两个探测器,可以详细查看应用程序的内存使用情况。分配探测允许检查特定时间跨度内驻留在内存中的对象。VM Tracker 探测器允许监控脏内存堆大小,这是 iOS 使用来确定何时必须强制关闭应用程序的主要指标。

当在 Instruments 中选择分配分析器时,两个探测器将同时运行。与往常一样,按下红色的“记录”按钮开始分析运行。

要正确设置分配探测,请确保以下设置正确。在窗口底部,确保分配寿命(中间选项)设置为 已创建且持久。在录制选项(文件菜单)中,确保选中 “丢弃释放内存的事件”

检查内存行为最有用的显示是统计信息显示,这是使用分配探测时的默认显示。该显示屏显示时间线。与推荐设置一起使用时,图表会显示蓝线,表示当前仍在进行的内存分配的时间和大小。通过观察此图,您只需重复测试场景并确保运行之间没有蓝线仍然存在,即可观察长期存在或泄漏的内存。

另一个有用的显示是调用树显示。它显示执行分配的代码行,以及该代码行负责的内存消耗量。您可以通过单击 “详细信息”右侧的 来更改显示,如下所示:

图像

下面您可以看到,被测应用程序的总内存使用量中大约 25% 完全是由着色器引起的。考虑到着色器在加载线程中的位置,这些必须是与默认 Unity 项目捆绑在一起的标准着色器,然后在应用程序启动时加载。

image01

与以前一样,一旦您确定了热点,如何处理它完全取决于您的项目。

就这样。仪器的简要指南。约 1000 个单词,没有 A 团队参考。我们不想像 上次那样陷入麻烦。版权侵权正式不再有趣™。

企业支持团队正在创建更多此类指南,我们将在未来几个月内发布最佳实践指南的完整版本!

当计划顺利完成时我们会感到高兴。