Unity官方文档笔记(三)Unity性能分析器

一、Profiler窗口入门

默认情况下,性能分析器记录并保留游戏的最后 300 帧,并显示有关每一帧的详细信息。可以在 Preferences 窗口(菜单:File > Preferences)中增加其记录的帧数(至多 2,000 帧)。

1.1 性能分析器控件

Deep Profile
启用此设置可对所有 C# 方法进行性能分析。启用此设置后,Unity 会将检测功能添加到所有 Mono 调用,然后便可以对脚本进行更详细的调查。请参阅深度性能分析。
Call Stacks
要记录用于脚本内存分配的调用栈,请单击此开关。启用此选项时,性能分析器记录的帧具有 GC.Alloc 样本中的信息;即使在 Deep Profile 未激活的情况下,完整调用栈上的这些样本也会导致托管脚本分配。有关更多信息,请参阅“CPU Usage Profiler 模块”页面的分配调用栈部分。

1.2 深度性能分析

通常,性能分析器仅对用 ProfilerMarker 显式包裹的代码时序进行性能分析。
如果未向您自己的代码添加更显式的 ProfilerMarker 检测,您可以视为脚本代码的子样本的唯一其他样本是回调到 Unity API 中的样本(如果已对该 API 进行检测)。带有性能开销的大多数 API 调用都会经过检测。例如,通过 Camera.main API 访问主摄像机的操作被注册为“FindMainCamera”样本。
深度性能分析是资源密集型操作,会耗用大量内存。因此,在进行性能分析时,应用程序运行速度显著降低。深度性能分析更适合用简单脚本编写的小游戏。如果使用的是复杂脚本代码,则应用程序可能根本无法使用深度性能分析。对于许多较大的应用程序,深度性能分析可能会使 Unity 耗尽内存。
如果遇到问题,导致性能分析器的太多样本存储在环形缓冲区(用于将样本流式传输到性能分析器)中,Unity 将显示一条错误消息。为了增加环形缓冲区的大小,可以调整进行性能分析的播放器的 Profiler.maxUsedMemory 属性。
更多

二、应用程序性能分析

移动设备上的性能分析
iOS 和 Android 设备均支持通过网络进行远程性能分析。如果使用了防火墙,请在防火墙的出站规则中开放端口 54998 至 55511。这些是 Unity 用于远程性能分析的端口。
Android 远程性能分析
adb连接时profile 和 deep profile命令
adb forward tcp:34999 localabstract:Unity-{insert bundle identifier here
adb shell am start -n {insert bundle identifier here}/com.unity3d.player.UnityPlayerActivity -e ‘unity’ ‘-deepprofiling’
更多

三、CPU Usage Profiler 模块

Timeline 视图
Timeline 视图是 CPU Usage Profiler 模块的默认视图。该视图简单列出了应用程序中所花费的时间情况以及时间的相互关联情况。与 Hierarchy 视图不同,Timeline 视图沿同一时间轴在各自子部分中显示所有线程的性能分析数据。
渲染和 VSync 样本
这些样本显示 CPU 在何处花时间来处理 GPU 的数据,或者可能在何处等待 GPU 完成。如果 GPU Profiler 不可用或者增加过多开销,则工具栏不会显示此信息。这些样本可用于了解应用程序是 CPU 密集型还是 GPU 密集型。

样本功能
WaitForTargetFPS应用程序在等待 Application.targetFrameRate 指定的目标 FPS 方面花费的时间。
如果此样本是 Gfx.WaitForPresentOnGfxThread 的子样本,则表示应用程序在等待 QualitySettings.vSyncCount 中配置的 VSync 方面花费的时间。
注意:Editor 不会对 GPU 进行 VSync 操作,而是使用 WaitForTargetFPS 来模拟 VSync 的延迟。某些平台(尤其是 Android 和 iOS)强制执行 VSync 或默认帧率上限为 30 或 60。
Gfx.ProcessCommands包含对渲染线程上渲染命令的所有处理。可能会花费此时间的一部分来等待 VSync 或主线程的新命令;可通过子样本 Gfx.WaitForPresentOnGfxThread 来了解此时间。
Gfx.WaitForCommands指示渲染线程已准备好接受新命令,并且可能指示主线程上出现瓶颈。
Gfx.PresentFrame指示应用程序在等待 GPU 渲染和呈现帧方面花费的时间,其中可能包括等待 VSync 的时间。主线程上的 WaitForTargetFPS 样本可以显示该时间中等待 VSync 所花费的时间。
Gfx.WaitForPresentOnGfxThread指示主线程已准备好开始渲染下一帧,但是渲染线程尚未结束对于在 GPU 上呈现该帧的等待。这可能表明应用程序是 GPU 密集型。要查看渲染线程同时在哪些方面花费时间,请查看 Timeline 视图。
如果渲染线程将时间花费在 Camera.Render 中,则表示应用程序为 CPU 密集型并且可能花费太多时间向 GPU 发送绘制调用或纹理。
如果渲染线程将时间花费在 Gfx.PresentFrame 中,则表示游戏是 GPU 密集型,或者可能在等待 GPU 上的 VSync。Gfx.WaitForPresentOnGfxThread 的 WaitForTargetFPS 子样本可以指示应用程序用于等待 VSync 的呈现阶段的一段时间。呈现阶段是从 Unity 指示图形 API 交换缓冲区到此操作完成时间之间的一段时间。
Gfx.WaitForRenderThread指示主线程正在等待渲染线程处理目前位于命令流中的所有命令。此样本仅在多线程渲染中出现。

多线程样本

样本功能
Idle每当 JobSystem 没有使用工作线程时,都会发出 Idle 样本。JobSystem 唤醒 Idle 样本时(例如,为了调度新作业),这些样本之间通常会出现较小的间隙时间。较长的间隙时间指示尚未检测原生作业。
Semaphore.WaitForSignal该线程正在等待另一线程中完成某项操作。要找出所等待的线程,请在 Timeline 视图中查看在此线程之前不久结束的所有样本。
WaitForJobGroupID触发了 JobHandle 上的同步栅栏 (Sync Fence)。这可能导致工作窃取。一个工作线程完成工作,然后等待其他工作线程完成工作时,就会发生工作窃取。这些显示为在此样本下执行的作业样本。“被窃取”的作业不一定是所等待的作业。

更多

四、GPU Usage Profiler 模块

GPU Usage Profiler 模块显示应用程序的 GPU 时间使用情况。只能在运行模式 (Playmode) 下使用 GPU Profiler 或者用于应用程序的构建。不能用于对 Editor 进行性能分析。
注意:如果在 Player Settings 中启用了 Graphics Jobs,则不支持 GPU 性能分析。此外,在 macOS 上,只能在 Mavericks 10.9 或更高版本上对 GPU 进行性能分析。
GPU性能分析支持

平台图形API状态
WindowsDirectX 11、DirectX 12、OpenGL受支持
WindowsVulkan不支持
macOSOpenGL支持。注意:Apple 已废弃对 OpenGL 的支持。
macOSMetal不支持。改用 XCode 的 GPU 帧调试器 UI。
AndroidOpenGL在运行 NVIDIA 或 Intel GPU 的设备上受支持。
AndroidVulkan不支持
iOSOpenGL支持。注意:Apple 已废弃对 OpenGL 的支持。
iOSMetal不支持。改用 XCode 的 GPU 帧调试器 UI。

更多


版权声明:本文为u010848412原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。