[Profiling] 剖析 Unity 游戏的终极指南[4] - Unity分析和调试工具(上)

英文原文:https://resources.unity.com/games/ultimate-guide-to-profiling-unity-games?utm_source=demand-gen&utm_medium=pdf&utm_campaign=render-with-quality-and-flexibility&utm_content=introduction-to-urp-ebook

本节深入探讨 Unity 中可用的每个分析和调试工具的功能。


关于工具差异的说明

  本节中提到的一些工具属于其他类别,例如调试工具,例如 Frame Debugger。 虽然它们在技术上不是分析器,但在分析和改进 Unity 项目时,将它们包含在您的工具包中很重要。

以下是分析、调试和静态分析工具之间的区别。

  • 分析工具检测和收集与代码执行相关的时序数据。
  • 调试工具允许您逐步执行程序、暂停和检查值,并提供许多其他高级功能。 例如,Frame Debugger 允许您逐步完成帧的渲染、检查着色器值等等。
  • 静态分析器是可以将源代码或其他资产作为输入并使用内置规则分析它们以推断所述输入的“正确性”的程序,而无需运行项目。
Profiler

  Unity Profiler 可帮助您在运行时检测任何瓶颈或冻结的原因,并更好地了解特定帧或时间点发生的情况。

  Unity 中的分析是基于检测的,为您提供大量 Profiler 标记数据以供使用。 请注意,直接在编辑器中进行分析会增加一些开销,并且可能会扭曲您的结果。 同样,您的开发机器可能比您的目标设备强大得多。

  仅启用您希望使用的 Profiler 模块或使用 Standalone Profiler,它提供了诸如更清晰的分析数据和减少分析开销等好处。

  作为一般经验法则,始终启用 CPU、内存和渲染器模块很有用。 启用其他 Profiler 模块,如您认为合适的音频和物理。

Unity Profiler 入门

请按照以下步骤开始使用 Unity Profiler:

  • 分析时必须使用开发版本。 通过 File > Build Settings > Select Development Build 执行此操作

  • 勾选 Autoconnect Profiler 复选框(这是可选的)。

    • 注意:Autoconnect Profiler 最多可以将初始启动时间增加 10 秒,并且只有在您想要分析第一个场景的初始化时才应启用。 如果您不启用 Autoconnect Profiler,您始终可以手动将 Profiler 连接到正在运行的开发版本
  • 为目标平台构建

  • 通过 Window > Analysis > Profiler 打开 Unity Profiler。

  • 禁用您不需要的任何 Profiler 模块。 启用的每个模块都会对播放器产生性能开销。 (您可以使用 Profiler.CollectGlobalStats 标记观察其中的一些开销)。

  • 禁用您的设备移动网络,并启用 WiFi。

  • 在目标设备上运行构建。

    • 如果您选择 Autoconnect Profiler,则构建将包含编辑器机器的 IP 地址。启动时,应用程序将尝试直接连接到此 IP 地址的 Unity Profiler。 Profiler 将自动连接并开始显示框架和分析信息。
    • 如果您没有选择 Autoconnect Profiler,那么您将需要使用 Target Selection 下拉菜单手动连接到您的 Player。

在这里插入图片描述
自动连接到目标设备时的 Profiler

  为了节省构建时间(以降低准确性为代价),请直接在 Unity 编辑器中配置您的应用程序。 从 Profiler 窗口的 Attach to Player 下拉菜单中选择 Playmode。

在这里插入图片描述
使用 Profiler 定位在 Playmode 中运行的游戏

Profiler 提示
在 CPU Usage Profiler 模块中禁用 VSync 和其他类别
VSync 标记代表“死区时间”,其中 CPU 主线程在等待 VSync 时处于空闲状态。 隐藏标记有时会让人难以理解其他类别时间是如何形成的,甚至是总帧时间是如何形成的。 考虑到这一点,另一种选择是重新排序列表,使 VSync 位于顶部。 这提供了更清晰的图形视图,其中由 VSync 标记添加的“噪声”被减少,整体画面更清晰。

其他标记代表分析开销,可以安全地忽略,因为它不会出现在项目的最终构建中

在构建中禁用 VSync
获得主线程、渲染线程和 GPU 交互方式的清晰图像的另一个选项是分析完全禁用 VSync 的构建。 转到 Edit > Project Settings… 然后选择 Quality 并单击要在目标设备上使用的 Quality Level(s) 并将 VSync Count 设置为 Don’t Sync。

制作游戏的开发版本,并将 Profiler 连接到它。 无需等待下一个 VBlank,游戏将在前一帧完成后立即开始一帧。 在某些平台上禁用 VSync 可能会导致视觉伪影,例如撕裂(在这种情况下,请记住为发布版本重新启用它),但消除人为等待可以使分析器捕获更易于阅读,特别是当您正在调查哪里 瓶颈在您的项目中。

知道何时在播放模式或编辑器模式下进行分析
使用 Profiler 时,您可以选择播放模式、编辑器或远程或连接的设备作为播放器目标。

使用 Playmode 来分析您的游戏/应用程序,并使用 Editor 模式来查看围绕游戏的 Unity Editor 正在做什么。
使用 Editor 作为 profiling 的目标对 profiling 的准确性有很大的影响。 Profiler 窗口有效地递归地分析自身。 但是,如果编辑器的性能变慢,则对其进行概要分析可能很有价值。 然后,您可以识别会降低编辑器速度并妨碍工作效率的脚本和扩展。

您可能想要对编辑器进行概要分析的示例包括:

  • 如果按下播放按钮后需要很长时间才能进入播放模式
  • 如果编辑器变得迟钝且反应迟钝
  • 如果一个项目需要很长时间才能打开。 博客文章“更有效地使用资产数据库的提示”描述了如何使用 -profiler-enable 命令行选项从编辑器开始运行的那一刻开始进行分析。

使用Standalone Profiler
  使用Standalone Profiler。 在这里,当您想要执行播放模式或编辑器分析时,Profiler 作为一个新进程启动,与 Unity 编辑器分开。 这可以避免 Profiler UI 或 Editor 对测量的时序产生影响。 您还将获得一组更清晰的分析数据来过滤和使用。
在这里插入图片描述

Editor 中的配置文件以进行快速迭代
  当您想要快速迭代修复性能问题时,在编辑器中进行配置文件。 例如,如果在构建中发现了性能问题,请在编辑器中配置文件以验证您是否也可以在那里找到它。 如果您确实发现了问题,请使用 Play 模式分析来快速迭代更改以找到潜在的解决方案。 问题解决后,进行构建并验证该解决方案是否也适用于目标设备。

  此工作流程是最佳的,因为您花费更少的时间来构建更改和部署到设备。 相反,您可以在编辑器中快速迭代并使用分析工具来验证您的更改结果。

这里有更多资源可帮助您探索 Unity Profiler 的其他用例和功能:


Frame Debugger

  帧调试器通过让您在特定帧上冻结正在运行的游戏的播放并查看用于渲染它的各个绘制调用来帮助您优化渲染。 该工具可让您逐个浏览绘图调用列表,因此您可以查看构建帧以从其图形元素形成场景的帧。

  与其他帧调试工具相比,帧调试器的一个优点是绘制调用对应于游戏对象的几何形状,该对象将在主层次结构面板中突出显示以帮助识别。

  帧调试器还可用于通过逐帧分析渲染顺序来测试过度绘制。 有关详细信息,请参阅下面的优化提示。

在这里插入图片描述
使用 Frame Debugger 分析已识别的过度绘制是如何发生的

从 Window > Analysis > Frame Debugger 菜单打开 Frame Debugger。

  当您的应用程序在编辑器或设备上运行时,单击启用。 这将暂停应用程序并在 Frame Debug 窗口的左侧按顺序列出当前帧的所有绘制调用。 还包括其他详细信息,例如帧缓冲区清除事件。

在这里插入图片描述
Frame Debugger 窗口在左侧列出了绘制调用和事件,并提供了一个滑块以直观地逐步浏览每一个。

  调试器窗口顶部的滑块可让您快速浏览绘图调用以快速定位感兴趣的项目。

  Unity 向图形 API 发出绘制调用以在屏幕上绘制几何图形。 绘制调用告诉图形 API 绘制什么以及如何绘制。 每个绘图调用都包含图形 API 所需的所有信息,例如有关纹理、着色器和缓冲区的信息。 通常,绘制调用的准备工作比绘制调用本身更耗费资源。

  这个准备过程被归类为所谓的“渲染状态”。 优化此区域性能的一种方法是减少对此渲染状态的更改次数。

  帧调试器有助于识别绘图调用的来源。 使用它来可视化和理解渲染过程,以指导有关如何对绘制调用进行分组的决策,以减少对渲染状态的更改。

在这里插入图片描述
  游戏窗口显示在帧调试器中构建的场景帧,包括选定的绘制调用(接近应用后处理效果的末尾)。

  参考 Frame Debugger 的列表层次结构来定位关注的绘图调用的来源。 从列表中选择一个项目将显示场景(在游戏窗口中),因为它出现并包括该绘制调用。

  列表层次结构右侧的面板提供有关每个绘制调用的信息,例如几何细节和用于渲染的着色器。

在这里插入图片描述
  选择了一个绘制调用,显示其着色器的详细信息、从批处理中排除的原因以及着色器属性值都在详细信息区域中可见。

  除了着色器属性值,ShaderProperties 部分还显示了它在哪些着色器阶段中使用(例如,顶点、片段、几何、外壳、域)。
在这里插入图片描述
着色器阶段在 ShaderProperties 详细信息部分中显示。

远程 Frame Debugger

  可以在支持的平台上远程将帧调试器附加到播放器(不支持 WebGL)。 对于桌面平台,为构建启用后台运行。

要设置远程帧调试:

  • 为您的目标平台创建项目的标准构建(选择 Development Player)。
  • 运行player。
  • 从编辑器中打开帧调试窗口。
  • 单击播放器选择下拉菜单并选择正在运行的活动播放器。
  • 单击Enable。

  您现在可以单步执行 Frame Debug 列表层次结构中的绘制调用和事件,并在活动播放器中观察结果。

在这里插入图片描述
附加到远程播放器构建的帧调试窗口。

渲染目标显示选项

  Frame Debug 窗口有一个工具栏,可让您隔离 Game 视图当前状态的红色、绿色、蓝色和 Alpha 通道。

  使用通道按钮右侧的“级别”滑块根据亮度级别隔离视图区域。 这些控件在渲染到 RenderTexture 时启用。

  一次渲染到多个渲染目标时,您可以使用 RenderTarget 下拉列表选择要在游戏视图中显示的目标。

在这里插入图片描述
Frame Debug 渲染目标深度通道控件。

下拉列表还有一个 Depth 选项来显示深度缓冲区的内容。

在这里插入图片描述
使用 Frame Debug 窗口查看深度缓冲区内容

针对常见陷阱的五种渲染优化
使用这些提示和技巧来优化可以使用帧调试器和其他渲染调试工具识别的常见渲染性能问题。

首先确定您的性能瓶颈
首先,找到具有高 GPU 负载的帧。 大多数平台都提供了可靠的工具来分析您的项目在 CPU 和 GPU 上的性能。 示例包括用于 Arm 硬件/Mali GPU 的 Arm Mobile Studio、用于 Microsoft Xbox 的 PIX、用于 Sony PlayStation 的 Razor 和用于 Apple iOS 的 Xcode Instruments。
使用您各自的本机分析器将帧成本分解为其特定部分。 这是您提高图形性能的起点。
在这里插入图片描述
此视图在 PS4 Pro 上以大约 45 毫秒/帧的速度受 GPU 限制。

绘制调用优化
  PC 和当前一代的主机硬件可以推送大量的绘图调用,但每个调用的开销仍然足够高,足以保证尝试减少它们。 在移动设备上,绘制调用优化至关重要。 您可以通过绘制调用批处理来实现这一点。
使用帧调试器来帮助识别可以重组的绘制调用以获得最佳的组和批处理。 该工具还有助于确定某些绘图调用无法批处理的原因。
有助于减少绘图调用批处理的技术包括:

  • 遮挡剔除:移除隐藏在前景对象后面的对象并减少过度绘制。 请注意,这需要额外的 CPU 处理,因此使用 Profiler 确保将工作从 GPU 转移到 CPU 是有益的。
  • GPU instancing:如果您有许多共享相同网格和材质的对象,这可以减少您的批次。 场景中有限数量的模型可以提高性能。 如果巧妙地完成,您可以构建一个复杂的场景,而不会让它看起来重复。
  • SRP Batcher:这可以通过批处理 Bind 和 Draw GPU 命令来减少绘制调用之间的 GPU 设置。 要从 SRP 批处理中受益,请根据需要使用尽可能多的材质,但将它们限制为少量兼容的着色器变体,例如通用渲染管线 (URP) 和高清渲染管线 (HDRP) 中的光照和无光照着色器,关键字组合之间的变化尽可能少。

通过减少透支优化填充率
  过度绘制可能表明应用程序试图在每帧中绘制比 GPU 处理能力更多的像素。 不仅性能受到威胁,移动设备的散热和电池寿命也受到影响。 您可以通过了解 Unity 在渲染对象之前如何对对象进行排序来对抗过度绘制。
  内置渲染管道根据其渲染模式和渲染队列对游戏对象进行排序。 每个对象的着色器将其放置在渲染队列中,这通常决定了它的绘制顺序。
  在另一个之上渲染的对象会创建过度绘制。 如果您使用的是内置渲染管道,请使用场景视图控制栏来可视化过度绘制。 将绘制模式切换为过度绘制。
在这里插入图片描述
在场景视图控制栏中过度绘制

明亮的像素表示对象在彼此之上绘制,而黑暗的像素表示较少的过度绘制。
在这里插入图片描述
HDRP 对渲染队列的控制略有不同。 阅读有关渲染器和材质优先级的部分以更详细地了解此方法。

HDRP 包括可以识别过度绘制的工具。 要在 HDRP 游戏中查找过度绘制,请通过 Window > Render Pipeline > Render Pipeline Debug 使用 Render Pipeline Debug 工具。

转到渲染部分,并将全屏调试模式更改为 TransparencyOverdraw.

此调试选项将每个像素显示为热图,范围从黑色(表示没有透明像素)到蓝色,然后是红色,后一种颜色表示透明像素的最大像素成本数。
在这里插入图片描述
为全屏调试模式启用 TransparencyOverdraw 以帮助定位场景中的过度绘制。

启用此模式后,您可以播放应用程序的场景和区域,并注意显着过度绘制的区域。
在这里插入图片描述
使用 HDRP 和全屏调试模式可视化过度绘制

检查你最昂贵的着色器
这是一个深奥的话题,但总的来说,旨在尽可能降低着色器的复杂性。 这里的一些简单的胜利涉及尽可能降低精度,即,如果可以的话,使用半精度浮点变量。 您还可以了解目标平台的波前占用率以及如何使用 GPU 分析工具来帮助获得健康的占用率。

渲染的多核优化
在播放器设置 > 其他设置中启用图形作业,以利用 PlayStation 和 Xbox 中的多核处理器。 Graphics job 允许 Unity 将渲染工作分散到多个 CPU 内核上,从而消除渲染线程的压力。 有关详细信息,请参阅多线程渲染和图形作业教程

配置文件后处理效果
确保您的后处理资产针对您的目标平台进行了优化。 最初为 PC 游戏创作的 Asset Store 工具可能会在主机或移动设备上消耗比所需资源更多的资源。 使用其本机分析器工具分析您的目标平台。 在为移动设备或主机目标创作您自己的后处理效果时,请让它们尽可能简单。

  还有更多工具可用于帮助进行框架调试和分析。 查看分析和调试工具索引以获得更多灵感。

要了解有关 Unity 帧调试器的更多信息,请查看以下资源:


Profile 分析器

  虽然标准 Unity Profiler 允许您进行单帧分析,但 Profile Analyzer 可以聚合和可视化从一组 Unity Profiler 帧中捕获的分析标记数据。

要开始使用 Profile Analyzer:

  • 通过 Window > Package Manager 安装 Profile Analyze Package。

  使用 Profile Analyzer 时,一个好方法是保存分析会话,以便在性能优化工作之前和之后进行比较。

在这里插入图片描述
从 Package Manager 安装 Profile Analyzer。

  Profile Analyzer 提取 Unity Profiler 中捕获的一组帧,并对它们进行统计分析。 然后显示此数据,为每个函数生成有用的性能时序信息,例如最小值、最大值、平均值和中值时序。

它可以帮助您在开发过程中回答问题和优化问题。 将其用于游戏场景的 A/B 测试以了解性能差异,比较分析数据之前和之后的代码重构和优化、新功能甚至 Unity 版本升级。

在这里插入图片描述
作为 Unity Profiler 的绝佳伴侣,Profile Analyzer 可用于聚合和比较在分析会话中捕获的多个帧

  在 Profile Analyzer 的单一视图中使用聚合数据视图还可以预先回答高级别的性能随时间变化问题。 这可能是查看数据的更好方式,而不是一次只查看一帧。 例如,在 300 帧(10 秒)的游戏捕捉或 20 秒的加载序列中:

  • 主线程和渲染线程上最大的 CPU 成本是多少?
  • 每个标记的平均/中位数/总成本是多少?

  这些问题的答案对于确定最大的问题在哪里以及在优化时应该优先考虑什么是必不可少的。

  Profile Analyzer 提供的统计数据和详细信息使您可以更深入地研究代码在跨多个帧运行时的性能特征,甚至可以与之前的配置文件捕获会话进行比较。

在这里插入图片描述
Profile Analyzer 具有用于分析分析数据的多种视图和方法。 它分为用于选择、排序、查看和比较分析数据集的面板。

  框架控制面板用于选择框架或框架范围。 选中后,“标记详细信息”窗格会更新以显示选择的聚合数据,其中包含有用统计信息的可排序标记列表。 标记摘要窗格显示有关选定标记的详细信息。 列表中的每个标记都是该标记的所有实例的聚合,跨越选定帧范围内的所有过滤线程。
在这里插入图片描述
Marker Summary 面板包含有关在 Marker Details 面板中选择的每个标记聚合的详细信息。

  使用过滤器按名称包含或排除标记,或按特定线程过滤。 这在查看时间或计数统计值的范围选择时很有用。

在这里插入图片描述
您可以按线程或标记名称进行过滤,以便在标记详细信息窗格中专注于性能数据的特定区域。

  调整过滤器时,可以自定义标记详细信息窗格以显示配置文件数据的不同统计数据集。 使用标记列下拉选择预设,或选择您自己的自定义选择。

在这里插入图片描述
标记列预设以自定义标记详细信息窗格的显示统计信息

预设是:

  • Time and count:显示有关标记被调用的平均时间和次数的信息
  • Time:显示有关标记的平均时间的信息
  • Totals:显示有关标记在整个数据集上花费的总时间的信息
  • Time with totals:显示有关标记的平均时间和总时间的信息
  • Count totals:显示有关标记被调用的总次数的信息
  • Count per frame:显示有关标记被调用的每帧平均总数的信息
  • Depths:显示标记在层次结构中的位置信息
  • Threads:显示标记出现的线程的名称
Profile Analyzer 视图
Single视图

  Single视图显示有关一组捕获的配置文件数据的信息。 使用它来分析轮廓标记如何跨帧执行。 此视图分为几个面板,其中包含有关时间的信息,以及帧、线程和标记的最小值、最大值、中值、平均值和下/上四分位数值。
在这里插入图片描述
Single视图显示单个或一系列帧的配置文件标记统计信息和时间。

  Single视图是任何分析工具包的重要组成部分,可提供许多有用的见解。 以下是一些深入研究它所呈现的数据的技巧。

Profile Analyzer 提示

  • 通过选择深度级别 4 来深入了解用户脚本(忽略 Unity 引擎 API 级别)。过滤到此级别并在时间线模式下查看 Unity Profiler 后,您可以关联调用堆栈深度以在此处进行选择 - Monobehaviour 脚本将 显示为蓝色,位于向下的第四层。 这是查看您的特定逻辑和游戏脚本是否在没有任何其他“噪音”的情况下自行负担的快速方法。
  • 以相同的方式过滤 Unity 引擎的其他区域的数据,例如Animators 或引擎物理。
  • 在 Frame Summary 部分的右侧,您会找到突出显示的方法的性能范围直方图。 将鼠标悬停在 Max Frame 编号(找到最大时序的确切帧)上以获得可点击的链接,以查看 Unity Profiler 中的帧选择。 使用此视图分析可能导致最大帧时间过长的其他因素。
Compare 视图

  比较视图是 Profile Analyzer 真正开始大放异彩的地方。 在此视图中,您可以加载 Profile Analyzer 以两种不同颜色显示的两个数据集。

  首先找到要测试的游戏或应用程序的特定区域。 执行此操作的一种方法是运行可以多次执行的预先录制或脚本化的游戏会话。 手动捕获多个会话播放也可以。

  使用“拉数据”方法将配置文件会话数据加载到 Profile Analyzer 中:

  • 通过 Window > Analysis > Profile Analyzer 打开 Profile Analyzer
  • 使用 Unity Profiler 在优化工作之前分析确定性会话
  • 在 Profile Analyzer 中,切换到 Compare 选项卡,然后单击第一个 Pull Data 按钮以从 Profiler 加载当前捕获。
  • 应用您的代码和性能改进,然后再次清除和分析新会话。
  • 单击第二个 Pull Data 按钮以加载新的会话数据。

注意:如果您选择加载选项,则数据必须采用 Profile Analyzer 的 .pdata 文件格式。 如果您有来自 Profiler 的 .data 文件格式的数据,请先在 Profiler 中打开它,然后单击 Profile Analyzer 中的 Pull Data 按钮。 确保在拉入之前保存您的 Profiler .data 文件,以便您也拥有这种格式的副本。

  使用 Marker Comparison 窗格查看第一个和第二个数据集(左和右)之间的标记时序差异。 如果左侧或右侧数据集的值较大,则标有 < 和 > 的列显示差异。

在这里插入图片描述
调整标记列过滤器将更改相应比较的值。

  有关每个标记比较列的更多详细信息,请参阅比较视图条目页面

比较中值和最长帧

  比较单个 Profiler 捕获中的中间帧和最长帧,以查明后者中发生的未出现在前者中的事情,或者查看完成时间比平均时间长的事情。

  打开 Profile Analyzer 比较视图并为左侧和右侧加载相同的数据集。 您还可以在单一视图中加载数据集,然后切换到比较。

  右键单击顶部框架控制图,然后选择选择中值框架。 右键单击底部图形,然后选择选择最长帧。

  Profile Analyzer 标记比较面板更新以显示差异。

在这里插入图片描述
比较捕获的中值和最长帧

  此处比较数据的另一个技巧是按帧持续时间对两个图进行排序(右键单击 > Order By Frame Duration),然后在每个集合中选择一个范围,关注或排除异常帧(不成比例地长或短的帧) .

在这里插入图片描述
按持续时间排序帧并选择异常值范围

  这允许在最普通和特殊的帧之间进行比较。 然后可以在称为标记比较的过滤表中分析当前所选范围的数据。

查看以下资源以了解有关 Profiler Analyzer 的更多信息:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值