Unity3D:应用程序性能分析

Unity3D:应用程序性能分析
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

应用程序性能分析

使用 Unity 性能分析器对应用程序进行性能分析时,可以通过三种主要方式记录数据:

  • 在目标平台上的播放器中对应用程序进行性能分析
  • 在 Unity 编辑器中以运行模式对应用程序进行性能分析
  • 对 Unity 编辑器进行性能分析

获得有关应用程序的准确时序的最佳方法是在打算发布它的终端平台上对它进行性能分析。这样可提供有关影响应用程序性能的因素的准确时序。

但是,每次要改进其性能元素时都构建应用程序可能会非常耗时。因此,要快速评估应用程序的性能,可以直接在编辑器中以运行模式对它进行性能分析。在运行模式下进行性能分析不会准确反映应用程序在真实设备上表现出的性能,但它是一个有用的工具,可在终端平台上进行初始分析后快速检查进行的更改是否可提高应用程序的性能。

Unity 编辑器可能会影响应用程序的性能,因为它在运行模式下运行时使用与应用程序相同的资源,因此还可以单独对编辑器进行性能分析以确定它使用的资源。如果应用程序仅设计为在运行模式下工作(例如用于电影制作),这会特别有用。

Profile your application on a target platform

要在目标发布平台上分析您的应用程序,请将目标设备连接到网络或通过线缆直接连接到计算机。还可以通过 IP 地址连接到设备。只能以开发版形式对应用程序进行性能分析。要进行此设置,请打开 Build Settings(菜单:File > Build Settings),然后选择应用程序的目标平台。启用 Development Build 设置。启用此设置后,与性能分析器相关的以下两个设置将变为可用状态:Autoconnect to ProfilerDeep Profiling Support

Build Settings 窗口,已启用性能分析选项
Build Settings 窗口,已启用性能分析选项

启用 Autoconnect Profiler 设置后,Unity 编辑器在构建过程中将自己的 IP 地址烘焙到已构建的播放器中。播放器启动时会尝试连接到位于所烘焙 IP 地址的编辑器中的性能分析器。

如果还启用了 Deep Profiling Support 设置,Unity 会在构建的播放器启动时执行深度性能分析,这意味着性能分析器会对代码的每个部分进行性能分析,而不仅仅是在 ProfilerMarker 中显式包裹的代码时序。这对于获取有关应用程序启动时间的深度性能分析信息很有用,但是,这会为构建增加少量开销。

在 Profiler 窗口中连接到播放器

要使用性能分析器手动连接到运行应用程序的平台,请在“附加到播放器”下拉列表中配置设置。仅当禁用了自动连接性能分析器时,才能执行此操作。

要使平台显示在“附加到播放器”下拉列表中,它必须满足以下要求:

  • 该平台在本地网络上可见,或通过电缆直接连接到本地机器。
  • 平台正在运行您在启用开发构建选项的情况下构建的播放器。有关如何为平台启用此设置的说明,请参阅在目标平台上分析应用程序。
  • 平台正在运行您的播放器。

附加到 Player 下拉列表显示 Unity 通过网络或直接连接检测到的所有 Unity 播放器。您可以通过玩家名称和运行播放器的产品名称(例如,“iPhonePlayer(我的 iPhone)”)来识别这些播放器。

您也可以通过播放器的 IP 地址直接连接到播放器。为此,请选择“附加到播放器”菜单,然后在下拉列表中选择<输入 IP>。在出现的对话框中,键入要连接到的播放机的 IP 地址和端口(可选)。

若要收集有关应用程序的分析信息,请从下拉菜单中选择“播放器”,然后单击“记录”。

若要在应用程序运行时持续收集数据,请在“播放器设置”(菜单:“编辑>项目设置”>“播放器>分辨率和演示文稿”)中启用“在后台运行”设置。启用此设置后,即使让应用程序在后台运行,探查器也会收集数据。如果禁用它,则 Profiler 仅在应用程序在活动窗口中运行时收集数据。

使用附加到播放器搜索栏

附加到播放器下拉列表包含一个搜索栏,可用于查找有关播放器的信息。您可以按玩家名称或设备类别进行搜索,例如远程。按类别搜索时,结果将显示该类别中的所有设备。

选择开发播放器的名称以在性能分析器中查看它。

附加到播放器属性

每列提供有关何时可用的以下信息:

属性:描述:
玩家姓名运行应用程序的设备的名称。

要更改此名称,请导航到“分析>分析器”>编辑>首选项,然后在“自定义连接 ID”字段中输入所需的名称。

您还可以在使用该参数从命令行启动播放器时设置玩家名称集。

有关此属性中的类别的详细信息,请参阅玩家名称设备类别
-connection-id
产品名称这是您在“项目>播放器设置”中设置的字段的值。
知识产权播放器的 IP 地址。
港口播放器的端口。

玩家名称设备类别

“玩家名称”类别包括以下类别,用于显示有关特定设备类型的信息:

属性:描述:
播放模式选择此属性以在运行模式下分析应用程序。
编辑模式选择此属性以分析 Unity 编辑器。
当地此列表包含在本地计算机、Unity 编辑器或独立播放器中运行的任何设备。

它还显示通过电缆物理连接到主机的播放器的信息。
远程此部分显示在本地网络上运行的设备的信息。

仅当 Unity 找到在本地网络上运行的远程设备时,才会显示此部分。
没有 ID 的连接本部分包括运行早于 Unity 的 Unity 版本的设备。

这些播放器没有产品名称IP 端口信息。

仅当 Unity 找到运行早于 Unity 2021.2 的播放器的设备时,才会显示此部分。
直接连接使用此选项连接到特定的 IP 和端口组合。此类别显示您连接到的最新 IP。

平台特定性能分析指南

将不同平台连接到 Unity 性能分析器时,它们会具有不同的行为方式。以下部分提供有关每个平台的一些常见行为的指导:

WebGL

可以在 WebGL 中使用 Unity 性能分析器,但不能通过编辑器连接到使用 WebGL 构建的正在运行的播放器。这是因为 WebGL 使用 WebSocket 进行通信,所以不允许浏览器端的传入连接。要连接到运行的播放器,必须在 Build Settings(菜单:File > Build Settings)中启用 Autoconnect Profiler 复选框。Unity 无法对 WebGL 的绘制调用进行性能分析。

移动设备上的性能分析

iOS 和 Android 设备均支持通过网络进行远程性能分析。如果使用了防火墙,请在防火墙的出站规则中开放端口 54998 至 55511。这些是 Unity 用于远程性能分析的端口。

有时,在设置远程性能分析后,Unity 编辑器可能无法自动连接到设备。如果发生此情况,可以手动发起性能分析器连接。为此,请选择 Profiler 窗口中的 Attach to Player 下拉菜单,然后选择相应设备。

也可以将目标设备直接插入计算机以避免网络或连接问题。

iOS 远程性能分析

要对 iOS 设备启用远程性能分析,请遵循以下步骤:

  1. 将 iOS 设备连接到 WiFi 网络。性能分析器会使用本地 WiFi 网络将性能分析数据从设备发送到 Unity Editor。
  2. 通过线缆将设备连接到计算机。打开 Build Settings(菜单:File > Build Settings),选中 Development BuildAutoconnect Profiler 复选框,然后选择 Build & Run
  3. 应用程序在设备上启动时,请在 Unity 编辑器中打开 Profiler 窗口(菜单:Window > Analysis > Profiler)。
Android 远程性能分析

Android 设备支持两种远程性能分析方法:通过 WiFi 或通过 Android Debug Bridge (adb)。

要进行 WiFi 性能分析,请遵循以下步骤:

  1. 在 Android 设备上禁用移动数据。
  2. 将 Android 设备连接到 WiFi 网络。性能分析器会使用本地 WiFi 网络将性能分析数据从设备发送到 Unity Editor。
  3. 通过线缆将设备连接到计算机。打开 Build Settings(菜单:File > Build Settings),选中 Development BuildAutoconnect Profiler 复选框,然后选择 Build & Run
  4. 应用程序在设备上启动时,请在 Unity 编辑器中打开 Profiler 窗口(菜单:Window > Analysis > Profiler)。

注意:Android 设备和主机(运行 Unity 编辑器)必须位于同一子网上才能正常进行设备检测。

要进行 Android Debug Bridge (adb) 性能分析,请遵循以下步骤:

  1. 确保设备处于开发模式并启用 USB debugging 设置
  2. 通过线缆将设备连接到计算机,并确保在 adb 设备列表中显示了该设备。
  3. 打开 Build Settings(菜单:File > Build Settings),选中 Development Build 复选框,然后选择 Build & Run
  4. 应用程序在设备上启动时,请在 Unity 编辑器中打开 Profiler 窗口(菜单:Window > Analysis > Profiler)。
  5. Attach to Player 下拉菜单中,选择 AndroidProfiler(ADB@127.0.0.1:34999)。仅当所选目标为 Android 时,下拉菜单中才会显示该条目。

选择 Build & Run 时,Unity Editor 会自动为应用程序创建 adb 隧道。如果要对另一应用程序进行性能分析,或者重新启动 adb 服务器,则需要手动配置此隧道。为此,请打开终端窗口或命令提示符窗口,并输入以下内容:

通过 USB 线缆建立编辑器到 Android 的连接时需要

adb forward tcp:34999 localabstract:Unity-{insert bundle identifier here}

通过 USB 线缆建立 Android 到编辑器的连接时需要

adb reverse tcp:34998 tcp:34999

要将深度性能分析用于 Android 构建,必须启用 Android Player Settings 中的 Mono Scripting Backend 设置(菜单:Edit > Project Settings > Player > Android > Other Settings),然后输入以下内容以便通过 adb 命令来启动游戏:

~$ adb shell am start -n {insert bundle identifier here}/com.unity3d.player.UnityPlayerActivity -e 'unity' '-deepprofiling'

Android Chrome OS 远程性能分析

Unity 无法自动发现 Chrome OS 设备。要启动连接,请通过 Android Debug Bridge (adb) 通过其 IP 地址连接到设备,然后从 Attach to Player 下拉菜单中选择 <Enter IP> 并输入设备的 IP 地址。连接后,您可以像如常对应用程序进行性能分析。

在 Unity 编辑器中进行性能分析

使用 Profiler 窗口在编辑器中运行应用程序并进行性能分析时,结果只是该应用程序在目标平台上运行时的行为的近似值。这是因为运行模式与编辑器的运行过程相同,所以无法将应用程序的 CPU、GPU 和内存使用量数据与 Unity 编辑器的使用量数据完全隔离。这会导致得出的性能分析数据出现误差。

要获得更好的性能分析结果,应该始终在目标设备上对应用程序进行性能分析,并且仅在编辑器中进行性能分析以快速迭代在设备上已确定的问题。

还可以在运行模式下进行性能分析或是对编辑器进行性能分析以确定与应用程序性能无关的问题,例如较长的加载时间或无响应的编辑器是否会减慢迭代时间,或者应用程序是否在运行模式下性能不佳。

每当在编辑器中进行性能分析时,都应确保在最大化视图中打开运行模式,并减少打开的编辑器窗口的数量。这可确保其他编辑器窗口不会在渲染线程和 GPU 上耗尽时间,从而影响性能数据。当运行模式处于最大化视图时,它会以更接近目标设备的分辨率运行应用程序,这会直接影响性能问题,例如与填充率相关的问题。

在运行模式下进行性能分析

性能分析器的默认目标是运行模式,这会在编辑器运行运行模式时记录活动。运行模式性能分析可用于测试快速更改而无需重新构建播放器,但是不应用于替代验证应用程序目标平台和设备上的构建。这是因为运行模式在与编辑器相同的应用程序和主线程中运行,这意味着在运行模式下进行性能分析时,编辑器的系统(例如 UI、Inspector、Scene 视图渲染和资源管理)会影响应用程序的性能和内存性能分析测量。

要在运行模式下有效地进行性能分析,应该定期构建应用程序并将它们部署到一系列目标设备(高规格和低规格设备),并在这些设备上对应用程序进行测试和性能分析。如果在这些设备上发现应用程序方面的性能问题,请缩小最需要关注的区域。

随后可以在运行模式下对应用程序进行性能分析,并快速迭代对应用程序进行的任何更改。可以使用通过在目标设备上对应用程序进行性能分析而获得的信息来确定在运行模式下对应用程序进行性能分析后是否存在任何类似行为。随后可以更改应用程序,并再次在运行模式下进行性能分析以快速查看更改所产生的效果。一旦对更改感到满意,请再次构建应用程序并部署到目标设备以验证更改。

PlayerLoop 和 EditorLoop 样本

为了减少编辑器在运行运行模式时创建的性能分析数据中的噪声和误导性测量数量,CPU 和 GPU 性能分析器模块将其时序拆分为在 PlayerLoopEditorLoop 中发生的时序。Unity 会向这些类型的性能分析器样本分配 PlayerLoop 和 EditorLoop 标记。

当性能分析器以运行模式为目标时,它只收集发生在 PlayerLoop 内部发生的时序样本。

在 CPU 性能分析器模块图表中,Unity 将所有 EditorLoop 样本都分类为 Others。因此,EditorLoop 样本是该类别的最大贡献者。如果想了解编辑器在这段时间内的操作,并且还想获得有关 Others 类别的其他贡献者的更详细细分,请将性能分析器目标更改为编辑器。

重要信息:如果使用深度性能分析并以运行模式为目标,则它对在 PlayerLoop 和 EditorLoop 中发生的每个函数调用都会产生性能影响。这是因为深度性能分析会在域重新加载时挂接到任何脚本方法调用的开始和结束,不会检测哪些部分从未从 PlayerLoop 进行调用。EditorLoop 中发生的方法调用不会产生完整的样本创建开销,但它们仍会检查是否应发出样本,这会导致较小但仍然存在的开销。

对编辑器进行性能分析

将性能分析器的目标更改为编辑器时,之前隐藏在 EditorLoop 标记下的所有样本都会归类到其各自的类别中。这意味着 CPU 性能分析器模块详细信息面板及其图表中的信息会显著更改。

要对编辑器的启动时间进行性能分析,请使用命令行选项 -profiler-enable 启动编辑器。

要减少 Profiler 窗口对编辑器性能的影响,可以使用独立性能分析器(它会在自己的进程中打开 Profiler 窗口)。如果选择编辑器作为性能分析目标,或是对应用程序进行深度性能分析,那么这会尤其有用,因为 Profiler 窗口本身通常使用可能会使性能数据出现偏差的资源。

对应用程序进行性能分析的最佳实践

对应用程序进行性能分析时,可以采取一些措施来确保性能分析会话之间的一致性,并确保 Unity 使用的进程不会影响性能分析数据:

  • 只添加与要调查到 Profiler 窗口的区域相关的性能分析器模块。要向性能分析器添加和移除模块,请选择 Profiler 窗口左上角的下拉选单。
  • 避免使用深度性能分析,因为它会在使用时产生较高开销。如果要查看有关带有标记(如 GC.Alloc 或 JobFence.Complete)的样本的更多详细信息,请导航到 Profiler 窗口工具栏并启用 Call Stacks 设置。这可提供样本的完整调用栈,其中会提供所需信息,而不会产生深度性能分析的开销。
  • 如果在性能分析器收集数据时不需要查看 Hierarchy 或 Timeline 视图更新,请禁用 Live 设置。停止记录以查看窗口的数据更新。
  • 使用 F9 快捷键启用或禁用性能分析器。可以使用此快捷键捕获性能数据,而无需打开 Profiler 窗口。如果打开了独立性能分析器,则使用此快捷键会在此窗口中开始记录。

此文由3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:垃圾回收最佳做法 (mvrlink.com)

下一篇:Unity3D:常见性能分析器标记 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号