前言

本系列笔记内容参考自官方文档

什么是Profiler

Unity Profiler是一个工具,您可以使用它来获取关于应用程序的性能信息。您可以将它连接到云端的设备或连接到本机器上的设备,以测试应用程序在预期的发布平台上如何运行。您还可以在编辑器中运行它,以在开发应用程序时获得资源分配的信息。[toc] Profiler收集并显示应用程序在CPU、内存、渲染和音频等方面的性能数据。可以定位应用程序中性能需要改进的地方,你可以精确定位你的代码,资产,场景设置,相机渲染,以及Build Setting影响应用程序的性能。它以一系列图表的形式显示结果,因此您可以可视化应用程序性能的峰值发生在何处。

如何查看Profiler

Window > Analysis > Profiler

包含内容

  • 开始使用Profiler窗口
    • 分析应用程序
  • CPU使用分析器模块
  • 呈现分析器模块
  • 内存分析器模块
  • 音频分析器模块
  • 物理性能分析模块
  • GPU分析器模块
  • 全局光照分析器模块
  • UI分析器模块

开始使用Profiler窗口

Profiler布局

A:Profiler控制菜单。使用这些控件可以设置从哪个设备进行分析,以及应该执行哪种分析,在帧之间导航,并开始记录数据。 B:上下文菜单。可选择色盲模式。 C:Profiler模块。这是您可以在应用程序中配置的所有模块的列表。使用该区域顶部的下拉菜单向窗口添加模块。 D:帧图表。此区域包含每个模块的概要文件图表。当您第一次打开分析器时,该区域是空白的,当您开始分析应用程序时,该区域将填充信息。 E:模块详细信息面板。窗口这个区域中的信息会根据您所选择的模块进行更改。例如,当您选择CPU Usage Profiler模块时,它包含一个详细的时间轴,并且切换到Hierarchy视图的选项。当您选择render Profiler模块时,此区域将显示调试信息列表。当您第一次打开分析器时,该区域是空白的,当您开始分析应用程序时,该区域将填充信息。

Profiler顶部菜单栏

分析器控件位于工具栏中在分析器窗口的顶部。使用它们来启动或停止记录Profiler数据,并在帧中导航。

Record

允许此设置在运行应用程序时记录活动模块的分析信息。如果没有启用此按钮,则分析器在运行应用程序时不会收集任何数据。

Deep Profile

深度性能检测能够监测所有C#方法。当您启用此设置时,Unity将检测添加到所有mono调用中,从而允许对脚本进行更详细的研究。看到深层的剖析。

Profile Editor

启用此设置来监测Unity编辑器。这将显示编辑器当前使用的资源。再次单击该按钮以停止分析编辑器。

Attach to Player

选择监测目标。默认情况下,这被设置为Editor——Unity编辑器。Unity还可以自动检测任何运行在您的网络上或通过USB连接的设备,并在下拉框中显示它们。在下拉框中单击Enter IP,手动输入要配置应用程序的设备的IP地址。有关更多信息,请参见分析应用程序。

Allocation Callstacks

分配调用堆栈要记录用于脚本化内存分配的调用堆栈,请单击此下拉菜单并选择托管分配。启用此选项时分析器记录的帧在GC中有信息。在完整调用堆栈上的Alloc示例将导致托管脚本分配,即使在Deep Profile未激活时也是如此。有关更多信息,请参见CPU使用分析器模块页面的分配callstack部分。

Clear on Play

当您下次在“播放器”窗口中单击“播放”或连接到新目标设备时,启用此设置可从“分析器”窗口中删除所有数据。

Clear

清除分析器窗口中的所有数据。

Load

将Profiler数据保存到Profiler窗口。您还可以通过Profiler加载已写入文件的二进制配置文件数据。按住Shift键并单击Load按钮将文件内容附加到当前Profile里。

Save

将分析器数据保存到项目文件夹中的.data文件中。

Transport controls

以帧为单位进行导航。 Frame number 帧号指示当前在分析器中查看的帧号。 Back arrow 后退一帧。 Forward arrow 前进一帧。 Current 跳转到最后记录的帧,并使分析器显示实时收集的数据。 为了保持低开销,Unity只每五帧重绘编辑器UI。这将导致一个稍微有些延迟的更新。

Deep Profiling

通常 Profiler只分析显式封装在profilermarker中的代码消耗。这包括从引擎的内部代码到自定义脚本代码的调用的第一个调用堆栈深度,比如MonoBehaviour的Start、Update或类似的方法。如果没有添加显式的ProfilerMarker包裹代码来让它可以被帧图表感知,那么您只能看到Unity API的样例(如果该API能被帧图表感知)。大多数带有性能开销的API调用都是可被帧图表感知的。例如,访问主摄像机通过调用 Camera.main API,它被注册为一个“FindMainCamera”示例,可以在帧图表看到。 当您启用Deep Profiling时,分析器会分析脚本代码的每个部分,并记录所有函数调用,包括至少第一次调用堆栈深度到任何Unity API。这是一些有用的信息,可以帮助您确定代码对应用程序性能的影响,但是它会带来很大的开销。 当你深入剖析你的应用程序时,Unity会将分析器工具注入到你所有的脚本方法中来记录所有的函数调用。这对于理解应用程序代码在何处花费的时间最多很有用。因为需要重新加载程序集来使用深度剖析,所以需要使用-deepprofiling命令行参数启动播放器。 深度剖析是资源密集型的,并且使用大量内存。因此,在进行分析时,应用程序的运行速度会明显变慢。深度剖析更适合使用简单脚本的小型游戏。如果您正在使用复杂的脚本代码,您的应用程序可能根本无法使用深度剖析,而对于许多较大的应用程序,深度剖析可能会使Unity耗尽内存。 如果您遇到问题,其中有太多的样本分析器存储在环缓冲区,它用来流到分析器,然后Unity显示一个错误消息。要增加环缓冲区的大小,可以调整Profiler.maxUsedMemory属性。 如果深度分析导致应用程序的帧率下降到无法运行的程度,那么可以手动分析脚本代码的块,这比深度分析的开销更小。使用profilermarker手动添加标记脚本块所需的工具。数据将出现在CPU Usage Profiler module中。 如果您想找出哪些调用堆栈导致GC(不用Deep Profiling),您可以打开Allocation Callstacks集合。启用 Managed Allocations时,可以在时间轴视图中选择GC.Alloc,或者使用Hierarchy视图中的Show Related Objects面板来查找这些样例的调用堆栈。有关更多信息,请参阅CPU分析器模块页中的分配调用堆栈文档。

Color blind mode

启用颜色盲模式,使分析器在其图形中使用更高的对比度颜色。这增强了红绿色盲(如后视、前视或三视)用户的可见性。要启用它,请转到Profiler窗口右上角的上下文菜单,并选择色盲模式。

Profiler modules

Profiler窗口的顶部被分成Profiler模块,用于分析游戏的特定区域。 当您配置您的应用程序时,Unity会在相应的图表中显示与每个模块相关的数据。 CPU Usage模块提供了应用程序在每个帧上花费的时间的最佳概述。 其他模块收集更具体的数据,可以帮助您检查更具体的区域,或者监视应用程序的重要部分,比如内存消耗、呈现或音频统计数据。 每个模块都有自己的图表。 当您选择一个模块时,模块详细信息面板将出现在窗口的底部,您可以使用该面板检查模块收集的详细数据。

CPU Usage

显示应用程序在物理、脚本、动画和GC等领域花费最多时间的概览。 此模块包含关于应用程序的广泛概要信息,您可以使用它来决定进一步使用哪些模块来研究应用程序中的更具体问题。这个模块总是活动的,即使您关闭它。

GPU usage

显示与图形处理相关的信息。 默认情况下,这个模块不是活动的,因为它有很高的开销。

Rendering

显示有关Unity如何在应用程序中呈现图形的信息,包括关于静态和动态批处理的信息、以及渲染流水线中的SetPass和Draw Call、三角形和顶点。

Memory

显示关于Unity如何在应用程序中分配内存的信息。 这对于了解脚本分配(GC.Alloc)如何导致垃圾收集,或者了解应用程序的资产内存使用随时间的变化趋势特别有用。

Audio

显示与应用程序中的音频相关的信息,例如何时以及有多少音频源 播放,音频系统需要多少CPU使用,以及有多少内存分配给它。

Video

在应用程序中显示与视频相关的信息。

Physics

在应用程序中显示物理引擎提供的有关物理的信息

Physics (2D)

与物理分析器模块类似,该模块显示物理引擎如何在应用程序中处理2D物理。

网络消息(不推荐使用)

显示关于多层高级API发送或接收的低层数据包和消息的信息。 注意:不推荐使用多人游戏高级API。

网络操作(不推荐使用)

显示关于多玩家高级API发送和接收的消息中包含哪些类型或操作的细粒度信息,例如传输了多少syncvar或命令。 注意:不推荐使用多人游戏高级API。

UI

显示有关Unity如何处理应用程序的UI批处理的信息,包括为什么以及如何对项目进行批处理。

UI Details

UI细节类似于UI模块,此模块的图表添加了有关批处理和顶点计数的数据,以及包含触发UI更改的用户输入事件信息的标记。

Global Illumination

显示关于Unity在应用程序的全局照明照明子系统上花费了多少CPU资源的信息。

Profiler module overhead

一些分析器模块有很大的数据收集开销,比如GPU、UI和音频分析器模块。为了防止这些模块影响应用程序的性能,您可以单击模块右上角的close按钮(x)来停用它。这将从窗口中删除模块,停止分析器收集模块的数据,并降低分析器的开销。 这不适用于CPU Usage模块,因为其他模块依赖CPU Usage模块,所以CPU Usage模块即使在非活动状态下也会收集数据。 要添加模块,请选择add Profiler下拉框并选择要激活的Profiler。当您从下拉菜单中选择Profiler模块时,它将开始收集数据,但不会显示它不活动期间的任何数据。 为了避免GPU分析器模块的开销,它在默认情况下是不活动的。GPU分析器模块必须在应用程序开始时处于活动状态,才能连接到图形驱动程序。如果您稍后添加它,它对大多数平台是无效的,并且分析器显示消息“显卡驱动程序不支持GPU概要(或者由于驱动程序bug而禁用了它)”。 如果您想要Profiler收集数据,请用Profiler.logFile API将数据发送到磁盘,而不是通过Profiler窗口。您可以通过Profiler.SetAreaEnabled()关闭Profiler模块。 通过外部IDE调试脚本的一些设置也可能造成开销。要避免这种开销并获得更精确的测量,请禁用编辑器附加设置(菜单:Preferences >External Tools)。类似地,当您分析构建游戏时(出包),打开Build Settings并禁用Script Debugging以避免这种开销。

Profiler frame charts(Profiler帧图表)

Profiler窗口的上部逐帧显示性能数据。当您运行应用程序时,分析器会记录每一帧的数据。Profiler窗口显示其概要文件中最近300帧。当您单击Profiler窗口的Profiler frame图表区域时,将出现一条白线,突出显示应用程序的一帧。要在各个帧之间导航,请点击Profiler顶部工具栏中的箭头。 Unity自动管理图表的垂直比例,图表试图填充窗口的垂直空间。要查看图表中的更多细节,您可以删除其他分析器模块,或者您可以拖动图表和详细统计区域之间的分割器,以增加图表的屏幕区域。 要在图表中切换隐藏和显示各个模块信息,请单击其模块中其标签旁边的彩色方块(纯黑代表隐藏,彩色代表启用)。这对于确定峰值的原因很有用。在堆叠图表中,例如CPU使用情况分析器的图表中,您可以重新排列度量标签,以影响堆叠顺序。这可以使图表更清晰。 每个Profiler模块收集不同的性能数据指标,并将它们显示在单独的图表中。当您单击一个帧时,Unity会在Profiler窗口下半部分的Module details窗格中显示关于框架的更多细节。此窗口中的详细信息的类型取决于您选择的概要文件模块。

Command line arguments(命令行参数)

如果您从命令行启动built Playe或Unity编辑器(例如Windows上的命令提示符、macOS上的终端、Linux shell或Android上的adb),您可以传递命令行参数来配置一些分析器设置。

-deepprofiling

在内置播放器中启用深度剖析。这只适用于基于Mono脚本

-profilestartup

监测播放器或编辑器的启动。当您对播放器使用这个参数时,它与在构建设置中启用自动连接分析器选项来构建播放器具有相同的效果。 当您对编辑器使用此参数时,它将在编辑器启动时开始在Profiler窗口中收集和显示Profiler信息。

-profiler-maxusedmemory

对于播放器是16MB,对于编辑器是256MB。您可以使用这个参数在启动时将maxUsedMemory参数设置为自定义大小(例如,-profiler-maxusedmemory 16777216)。大小以字节为单位设置。