Unity性能分析(一)流程与工具的使用

性能分析工作流对于游戏开发是“必备”的,从基本的三方面开始:

  • 在修改之前分析:建立基准线
  • 在开发过程中分析:确保修改不会影响性能
  • 在修改后分析:证明修改产生了预期效果

分析工具是开发者的实用工具之一,可以帮助开发者定位代码中的内存问题和性能瓶颈,也能帮助了解Unity引擎底层的运行。

Unity提供了多种分析工具,用于在Editor和目标设备上分析代码。建议使用各目标平台(例如Arm,Apple,PlayStation和Xbox等)自己的原生分析工具。

理解Unity中的分析工作

Unity的分析工具可在Editor和Package Manager中获得:

  • Unity Profiler:在Editor中,或连接到设备上,分析游戏的性能。
  • Profiling Core package:提供API,可以向Unity Profile捕获添加上下文信息。
  • Memory Profiler:提供深入内存性能分析。
  • Profile Analyzer:比较两个分析数据集,分析修改对性能的影响。

采样法分析vs仪表法分析

游戏性能分析通常采用:

  • 采样法分析
  • 仪表法分析

采样法分析是收集游戏运行时的统计数据并进行分析。

采样法分析器每n纳秒检测一次调用堆栈,并利用堆栈信息查明函数的调用时机(由哪些函数调用),以及持续时间。在这种分析方法中,提高采样率频率会提高准确性,但是会带来更高的开销。

仪表法分析

仪表法分析通过添加Profiler makers来“仪表化”代码,记录每个标记中的代码执行的详细时间信息。该分析器为每个标记捕获一系列Begin和End事件。这种方法不会丢失任何信息,但是需要按顺序放置标记,以便捕获数据。

Unity Profiler通过在多数Unity API接口设置标记,在重要原生函数和脚本代码间的调用进行了仪表化,捕获最重要的“概括信息”。也支持添加自定义Profiler makers进一步深入分析。

深层分析会自动在每个脚本方法调用中插入Begin和End标记,包括C# Getter和Setter属性。该系统在脚本侧提供了完整的分析细节,但也带来了相应的开销,根据在捕获的分析范围内调用次数的多少,也会让分析报告的时间产生膨胀。

Unity中的仪表化分析

如上所述,脚本代码调用(默认进行了仪表化)通常包括从Unity原生代码到托管代码的第一个调用堆栈。例如MonoBehaviour的常见方法:Start、Update、FixedUpdate等。

分析一个示例脚本,显示了Update()方法调用Unity的Instantiate()方法

在Profiler中,还可以看到Unity API回调的脚本代码的子采样。值得注意的是,涉及的Unity API代码需要具有自身的Profiler markers。大多数带有性能开销的Unity API都进行了仪表化。例如Camera.main会导致在捕获的分析数据中出现FindMainCamera标记。在检查捕获的数据集时,了解不同marker的含义非常重要。请使用常用Profiler markers列表来了解更多信息。

使用Camera.main会在捕获分析数据中出现FindMainCamera标记。

使用Profiler markers增加分析详细信息

默认情况下,Profiler会分析Profiler markers中包含代码的时间开销。在代码的关键函数中手动插入Profiler markers可增加详细信息而不产生全部的深层分析开销。

Profiler模块

分析器以每帧性能指标为基础,帮助找到瓶颈。通过使用分析器中包含的Profiler模块,如CPU Usage, GPU, Rendering, Memory, Physics等,深入了解细节。

Profiler窗口主视图,左侧显示模块,底部显示详细信息。

Profiler窗口在视图底部面板中列出了当前分析器模块捕获的详细信息。例如,CPU usage模块显示CPU工作的timeline或hierarchy视图,以及具体的时间。

CPU usage模块的timeline视图,显示主线程和渲染线程的标记详细信息。

默认情况下,分析器将连接到Unity Editor player实例。

在 Editor中进行分析和对独立构建分析的性能差异很大。将Profiler连接到目标设备上的独立构建是更好的选择,这样可以获得更准确的结果,而不受Editor开销的影响。

posted @ 2024-04-30 15:11  Flamesky  阅读(9)  评论(0编辑  收藏  举报