使用 Unity 性能分析器对应用程序进行性能分析时,可以通过三种主要方式记录数据:
获得有关应用程序的准确时序的最佳方法是在打算发布它的终端平台上对它进行性能分析。这样可提供有关影响应用程序性能的因素的准确时序。
但是,每次要改进其性能元素时都构建应用程序可能会非常耗时。因此,要快速评估应用程序的性能,可以直接在编辑器中以运行模式对它进行性能分析。在运行模式下进行性能分析不会准确反映应用程序在真实设备上表现出的性能,但它是一个有用的工具,可在终端平台上进行初始分析后快速检查进行的更改是否可提高应用程序的性能。
Unity 编辑器可能会影响应用程序的性能,因为它在运行模式下运行时使用与应用程序相同的资源,因此还可以单独对编辑器进行性能分析以确定它使用的资源。如果应用程序仅设计为在运行模式下工作(例如用于电影制作),这会特别有用。
要在目标发布平台上分析您的应用程序,请将目标设备连接到网络或通过线缆直接连接到计算机。还可以通过 IP 地址连接到设备。只能以开发版形式对应用程序进行性能分析。要进行此设置,请打开 Build Settings(菜单:File > Build Settings),然后选择应用程序的目标平台。启用 Development Build 设置。启用此设置后,与性能分析器相关的以下两个设置将变为可用状态:Autoconnect to Profiler 和 Deep Profiling Support。
启用 Autoconnect Profiler 设置后,Unity 编辑器在构建过程中将自己的 IP 地址烘焙到已构建的播放器中。播放器启动时会尝试连接到位于所烘焙 IP 地址的编辑器中的性能分析器。
如果还启用了 Deep Profiling Support 设置,Unity 会在构建的播放器启动时执行深度性能分析,这意味着性能分析器会对代码的每个部分进行性能分析,而不仅仅是在 ProfilerMarker 中显式包裹的代码时序。这对于获取有关应用程序启动时间的深度性能分析信息很有用,但是,这会为构建增加少量开销。
如果未在 Build Settings 中启用 Autoconnect Profiler,则可以手动连接到运行应用程序的平台。应用程序在播放器中运行时,播放器会显示在 Profiler 窗口的 Attach to Player 下拉选单中。Attach to Player 下拉选单会显示本地网络上运行的所有 Unity 播放器。通过播放器类型和运行播放器的主机名可以识别这些播放器(例如 “iPhonePlayer (Toms iPhone)”)。
还可以通过 IP 地址远程连接到播放器。为此,请选择 Attach to Player 菜单,然后在下拉选单中选择 <Enter IP>。一个对话框会出现,可以在其中键入要连接的播放器的 IP 地址和(可选)端口。
要开始收集有关应用程序的性能分析信息,请从下拉菜单中选择播放器,然后单击 Record。要在应用程序运行时持续收集数据,请启用 Player Settings 中的 Run In Background 设置(菜单:Edit > Project Settings > Player > Resolution and Presentation)。启用此设置后,即使让应用程序在后台运行,性能分析器也会收集数据。如果禁用此设置,性能分析器仅在应用程序在活动窗口中运行时才收集数据。
将不同平台连接到 Unity 性能分析器时,它们会具有不同的行为方式。以下部分提供有关每个平台的一些常见行为的指导:
可以在 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 设备启用远程性能分析,请遵循以下步骤:
Android 设备支持两种远程性能分析方法:通过 WiFi 或通过 Android Debug Bridge (adb)。
要进行 WiFi 性能分析,请遵循以下步骤:
注意:Android 设备和主机(运行 Unity 编辑器)必须位于同一子网上才能正常进行设备检测。
要进行 Android Debug Bridge (adb) 性能分析,请遵循以下步骤:
选择 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'
Unity 无法自动发现 Chrome OS 设备。要启动连接,请通过 Android Debug Bridge (adb) 通过其 IP 地址连接到设备,然后从 Attach to Player 下拉菜单中选择 <Enter IP>
并输入设备的 IP 地址。连接后,您可以像如常对应用程序进行性能分析。
使用 Profiler 窗口在编辑器中运行应用程序并进行性能分析时,结果只是该应用程序在目标平台上运行时的行为的近似值。这是因为运行模式与编辑器的运行过程相同,所以无法将应用程序的 CPU、GPU 和内存使用量数据与 Unity 编辑器的使用量数据完全隔离。这会导致得出的性能分析数据出现误差。
要获得更好的性能分析结果,应该始终在目标设备上对应用程序进行性能分析,并且仅在编辑器中进行性能分析以快速迭代在设备上已确定的问题。
还可以在运行模式下进行性能分析或是对编辑器进行性能分析以确定与应用程序性能无关的问题,例如较长的加载时间或无响应的编辑器是否会减慢迭代时间,或者应用程序是否在运行模式下性能不佳。
每当在编辑器中进行性能分析时,都应确保在最大化视图中打开运行模式,并减少打开的编辑器窗口的数量。这可确保其他编辑器窗口不会在渲染线程和 GPU 上耗尽时间,从而影响性能数据。当运行模式处于最大化视图时,它会以更接近目标设备的分辨率运行应用程序,这会直接影响性能问题,例如与填充率相关的问题。
性能分析器的默认目标是运行模式,这会在编辑器运行运行模式时记录活动。运行模式性能分析可用于测试快速更改而无需重新构建播放器,但是不应用于替代验证应用程序目标平台和设备上的构建。这是因为运行模式在与编辑器相同的应用程序和主线程中运行,这意味着在运行模式下进行性能分析时,编辑器的系统(例如 UI、Inspector、Scene 视图渲染和资源管理)会影响应用程序的性能和内存性能分析测量。
要在运行模式下有效地进行性能分析,应该定期构建应用程序并将它们部署到一系列目标设备(高规格和低规格设备),并在这些设备上对应用程序进行测试和性能分析。如果在这些设备上发现应用程序方面的性能问题,请缩小最需要关注的区域。
随后可以在运行模式下对应用程序进行性能分析,并快速迭代对应用程序进行的任何更改。可以使用通过在目标设备上对应用程序进行性能分析而获得的信息来确定在运行模式下对应用程序进行性能分析后是否存在任何类似行为。随后可以更改应用程序,并再次在运行模式下进行性能分析以快速查看更改所产生的效果。一旦对更改感到满意,请再次构建应用程序并部署到目标设备以验证更改。
为了减少编辑器在运行运行模式时创建的性能分析数据中的噪声和误导性测量数量,CPU 和 GPU 性能分析器模块将其时序拆分为在 PlayerLoop 和 EditorLoop 中发生的时序。Unity 会向这些类型的性能分析器样本分配 PlayerLoop 和 EditorLoop 标记。
当性能分析器以运行模式为目标时,它只收集发生在 PlayerLoop 内部发生的时序样本。
在 CPU 性能分析器模块图表中,Unity 将所有 EditorLoop 样本都分类为 Others。因此,EditorLoop 样本是该类别的最大贡献者。如果想了解编辑器在这段时间内的操作,并且还想获得有关 Others 类别的其他贡献者的更详细细分,请将性能分析器目标更改为编辑器。
重要信息:如果使用深度性能分析并以运行模式为目标,则它对在 PlayerLoop 和 EditorLoop 中发生的每个函数调用都会产生性能影响。这是因为深度性能分析会在域重新加载时挂接到任何脚本方法调用的开始和结束,不会检测哪些部分从未从 PlayerLoop 进行调用。EditorLoop 中发生的方法调用不会产生完整的样本创建开销,但它们仍会检查是否应发出样本,这会导致较小但仍然存在的开销。
将性能分析器的目标更改为编辑器时,之前隐藏在 EditorLoop 标记下的所有样本都会归类到其各自的类别中。这意味着 CPU 性能分析器模块详细信息面板及其图表中的信息会显著更改。
要对编辑器的启动时间进行性能分析,请使用命令行选项 -profiler-enable
启动编辑器。
要减少 Profiler 窗口对编辑器性能的影响,可以使用独立性能分析器(它会在自己的进程中打开 Profiler 窗口)。如果选择编辑器作为性能分析目标,或是对应用程序进行深度性能分析,那么这会尤其有用,因为 Profiler 窗口本身通常使用可能会使性能数据出现偏差的资源。
对应用程序进行性能分析时,可以采取一些措施来确保性能分析会话之间的一致性,并确保 Unity 使用的进程不会影响性能分析数据: