首页 > 其他分享 >Unity性能分析(四)Unity性能分析工具使用

Unity性能分析(四)Unity性能分析工具使用

时间:2024-04-30 15:22:40浏览次数:28  
标签:分析 Profile Frame Analyzer Profiler Unity 视图 性能 内存

使用Profiler

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

  • 在进行分析时,必须使用开发版本。File > Build Settings > Development Build。
  • 勾选Autoconnect Profile(可选)。
  • 注意:Autoconnect Profile会增加初始启动时间。如果不启用Autoconnect Profiler,可以随时手动连接正在运行的开发版本。
  • 针对目标平台进行构建。
  • 通过 Window > Analysis > Profiler 打开 Unity Profiler。
  • 禁用不关注的Profiler模块。每个启用的分析模块都会带来性能开销。(可以使用Profiler.CollectGlobalStats标记观察开销。)
  • 禁用设备的移动网络,保持 WiFi 开启。
  • 在目标设备上运行构建版本。
  • 如果选择Autoconnect Profiler,那么构建版本中将会嵌入Editor所在机器的 IP 地址。启动应用时,它将尝试直接连接到此 IP 的Profiler。Profiler 将自动连接并开始显示帧和分析信息。
  • 没有选择Autoconnect Profiler,则需要使用“Target Selection”下拉菜单手动连接。
Profiler与目标设备自动连接时

为了节省构建时间(牺牲准确性),在Editor中直接分析。在Profiler窗口中,从Attach to Player下拉菜单中选择Playmode。

在Playmode下分析

在CPU Usage中禁用VSync

CPU主线程在等待VSync时处于空闲状态。重新排序显示列表,使VSync标记位于顶部。这样可以降低VSync标记的干扰降,使整体画面更清晰。

在构建中禁用VSync

通过Edit > Project Settings,然后选择Quality ,设置VSync Count为Don't Sync。

发布development版本,并连接到Profiler。游戏不再等待下一个VBlank,而是在一帧完成后立即开始下一帧。禁用VSync可能会在某些平台上产生视觉撕裂(这种情况下,为release版本重新启用VSync)。

什么时候使用Playmode或Editor mode分析

使用Profiler时,可以选择Playmode、Editor、远程或附加设备作为目标。使用Editor作为分析目标,对分析的准确性有很大影响。因为Profiler实际上也递归地对分析了自己本身。

然而当Editor的性能变差时,分析Editor就非常就有价值了,可以分析是什么影响了Editor性能。

哪些情况需要包含Editor一起分析

使用Standalone Profiler

当在Editor下分析时,Standalone Profiler将作为一个新的进程启动。这避免了Profiler UI和Editor对时间统计的影响,以获得更干净的分析数据。

在Editor中分析并快速迭代

如果在构建包中发现性能问题,可以先在Editor中验证是否存在相同问题。如果存在问题,在Editor中定位并快速解决。一旦问题解决,再去目标设备上运行以验证解决方案。

这种优化过工作流程,可以不必先花费时间构建部署,而是先在Editor中快速迭代,再使用分析工具验证优化结果。

使用Frame Debugger

Frame Debugger在运行时允许暂停在指定帧,以查看渲染该帧的draw call信息。与其他帧调试工具相比,Frame Debugger有一个优点:如果draw call对应于某个 GameObject ,则该对象在Hierarchy面板中会突出显示。Frame Debugger也可以用于测试overdraw。

使用Frame Debugger分析overdraw

从Window > Analysis > Frame Debugger菜单中打开Frame Debugge。 在编辑器中或设备上运行应用程序时,单击Enable。应用程序将会暂停,并在帧调试窗口的左侧按顺序列出当前帧的所有draw call。还包括如帧缓冲清除事件等详细信息。

Frame Debugger在左侧列出draw call和event,并提供一个滑块,可以逐帧显示。

右侧的面板提供了draw call的详细信息,例如几何细节和shader。其他信息还包括draw call无法与之前合批的原因,以及输入到shader的属性值。

选中一个draw call,详细信息区域中显示shader,不能合批的原因,shader属性值。

除了shader属性值,ShaderProperties部分还会显示它在哪些阶段中被使用(例如vertex, fragment, geometry,hull, domain)。

着色器阶段会在ShaderProperties详细信息区域中显示

远程Frame Debugging

在支持的平台上(WebGL不支持),可以远程连接到Frame Debug。

设置远程frame debugging:

  • 创建目标平台的标准构建。
  • 运行播放器。
  • 从Editor中打开Frame Debugger。
  • 单击Player下拉列表,选择正在运行的目标。
  • 单击Enable。
Frame Debugger窗口远程连接到构建

Render target显示选项

Frame Debug窗口有一个工具栏,可以独立显示Game视图的R、G、B、A通道。使用channel按钮右侧的Levels滑块,按照亮度级别显示。当存在多个渲染目标时,可以使用RenderTarget下拉列表选择在Game视图中显示的渲染目标。

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

显示深度缓冲区内容

5个常见染优化技巧

首先定位性能瓶颈。主流平台都提供了分析CPU和GPU性能的工具。例如,Arm/Mali GPU,可以使用Arm Mobile Studio;Microsoft Xbox,可以使用PIX;Sony PlayStation,可以使用Razor;Apple iOS,可以使用Xcode Instruments。

1.draw call优化

降低draw call批次的技术包括:遮挡剔除;GPU实例化;SRP合批

2.减少overdraw,优化填充率

overdraw表明应用程序试图在每帧内绘制比GPU处理能力更多的像素。这不仅会影响性能,还会影响移动设备的热量和电池寿命。可以通过了解Unity在渲染对象之前如何对它们进行排序来解决过度绘制问题。

内置渲染管线根据对象的Rendering Mode和renderQueue进行排序。每个对象的着色器将其放入一个渲染队列中,通常决定其绘制顺序。

相互重叠的对象会产生过度绘制。如果正在使用内置渲染管线,请使用Scene viewcontrol来可视化overdraw。将绘制模式切换为Overdraw。

亮色像素表示对象重叠绘制,而暗色像素表示重叠绘制较少

标准视图 Overdraw视图

 

3.检查消耗性能的着色器

4.渲染的多线程优化

5.分析后处理效果

使用Profile Analyzer

Unity Profiler可以进行单帧分析,但是Profile Analyzer可以聚合显示一组Unity Profiler帧捕获的分析标记数据。

开始使用Profile Analyzer:通过Window> Package Manager 安装Profile Analyzer包。

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

Profile Analyzer会提取在Unity Profiler中捕获的一组帧,对它们进行统计分析。然后显示这些数据,为每个函数生成性能时间信息,例如最小值、最大值、平均值和中位数时间。 在开发过程中,它可以帮助解决和优化问题。将其用于游戏场景的A/B测试以查看性能差异,在较重构和优化代码前后分析数据,以及升级新功能或Unity版本前后使用。

在Profile Analyzer 的 Single view中使用总计数据也可以找到随时间变化的性能问题。

Profile Analyzer主窗口视图

Profile Analyzer 具有多种视图和分析性能数据的方式,它提供不同的面板用于选择、排序、查看和比较一组性能分析数据。

Frame Control 面板用于选择一帧或一组帧。选择后,Marker Details 面板将更新,以显示所选范围的数据,包含统计信息的排序列表。Marker Summary 面板显示选定标记的详细信息。列表中的每个标记都是该标记在所选帧范围内,跨所有筛选线程实例的聚合。

Marker Summary 面板显示 Marker Details 面板中选择的每个 Marker 集合的详细信息。

使用Name Filter,或Thread进行筛选。当查看 Time 或 Count 统计值的范围选择时,这非常有用。

按线程或标记名称进行筛选,以便在 Marker details 面板中关注特定的性能数据。

调整Filters时,Marker details面板可以自定义地显示分析数据的不同信息集。使用Marker column下拉菜单选择预设选项,或自定义选项。

使用Marker column的预设选项自定义Marker details面板显示的统计信息。

这些预设选项包括:

  • Time and count:显示markers平均计时和调用次数的信息
  • Time:显示markers的平均计时信息
  • Totals: 显示markers对整个数据集所需的总时间信息
  • Time with totals:同时显示markers的平均计时和总时间信息
  • Count totals: 显示markers被调用的总次数信息
  • Count per frame:显示markers每帧被调用的平均总次数信息
  • Depths:显示markers在层次结构中的位置信息
  • Threads: 显示markers所在的线程名称信息。

Profile Analyzer视图

Single视图

Single视图显示单个捕获数据集的信息。使用它来分析每一帧profile markers的执行情况。该视图分为几个面板,其中包含每帧、每个线程和每个标记的计时信息(最小值、最大值、中位值、平均值)。

Single视图显示单个或一组帧的profile marker统计信息和计时信息

Profile Analyzer使用提示

  • 通过选择Depth level为4,可以深入到用户脚本中(忽略Unity Engine API)。在Unity Profiler timeline模式下查看,您可以对调用堆栈深度进行相关分析: Monobehaviour脚本将以蓝色出现,并在第四个级别下。
  • 以同样的方式过滤Unity其他部分,例如animators或engine physics。
  • 在Frame Summary部分的右侧,可以找到突出显示的方法性能范围直方图。将鼠标悬停在最耗时帧上,获取可以点击的链接,从而查看Unity Profiler中的帧选择。使用此视图来分析导致该帧消耗时间的因素。

Compare视图

Compare视图是Profile Analyzer真正发挥作用的地方。在此视图中,您可以加载两个数据集,Profile Analyzer将以两种不同的颜色分别显示两个数据集。

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

  • 通过Window > Analysis > Profile Analyzer 打开Profile Analyzer。
  • 使用Unity Profiler捕获数据。
  • 在Profile Analyzer中,切换到对比页签,然后单击第一个“Pull Data”按钮加载来自Profiler的捕获数据。
  • 在代码和性能改进之后,使用Unity Profiler再次捕获数据。
  • 单击第二个“Pull Data”按钮加载新的捕获数据。

注意:如果选择加载选项,则数据必须采用Profile Analyzer的.pdata文件格式。如果拥有Profiler的.data格式的文件,请先在Profiler中打开它,然后单击Profile Analyzer中的Pull Data按钮。(确保在拉取数据之前保存Profiler的.data文件)

使用Marker Comparison查看第一组和第二组数据集(左侧和右侧)之间的计时差异。

调整Marker Columns filter会相应地更改要进行比较的值。

比较Median Frame和Longest Frame

在单个捕获数据中比较Median Frame和Longest Frame,找到在Longest Frame中出现,在Median Frame中没出现的事情,或查看哪些操作超过了平均完成时长。

打开Profile Analyzer的Compare视图,在左右两侧加载同一个数据集。也可以在Single视图中加载数据集,然后切换到Compare视图。

右键点击上侧的Frame Control图,选择Select Median Frame。右键点击下侧Frame Control图,选择Select Longest Frame。

Profile Analyzer的Marker比较面板将更新显示差异。

比较单个捕获数据中的Median Frame和Longest Frame

一个技巧是,在比较数据时将Frame Control图按帧时间排序(右键单击>Order By Frame Duration),然后在每个集合中选择一个范围来进行比较。

按照持续时间排序并选择范围

关于介绍Profiler Analyzer的其他资源:

Optimize game with the Profile Analyzer

Introduction to profiling in Unity

Memory Profiler

Memory Profiler是Unity Package Manager中的附加包。使用Memory Profiler可以在Editor中或运行时对内存进行快照。

快照可以显示引擎中的内存分配情况,帮助您快速识别导致过多或不必要的内存使用的原因,追踪内存泄漏,或查看内存碎片情况。

安装Memory Profiler package,通过点击Window >Analysis > Memory Profiler来打开。

Memory Profiler的顶部菜单栏可用于更改选择目标,捕获或导入快照。

更改选择,捕获或导入内存快照

注意:通过将Memory Profiler连接到目标硬件并使用目标选择下拉菜单,可以在远程设备上对其进行剖析。在Unity Editor中进行剖析会因Editor和其他工具的开销而导致不准确的数据。

在 Memory Profiler 窗口的左侧是工作区。使用它来管理、打开或关闭保存的内存快照。您也可以使用该区域在单个快照和比较视图之间切换。

Workbench面板用于管理内存快照

和Profile Analyzer类似,Memory Profiler允许您加载两个内存快照进行比较。这在查看内存使用量随时间或场景增长以及查找内存泄漏时特别有用。Memory Profiler的主窗口有几个选项卡,可让您深入研究内存快照,包括概要、对象和分配以及碎片化。

The Summary view

当您想要快速了解项目的内存使用情况时,请选择此视图。它还包含了捕获的内存快照所涉及的有用和重要的内存相关数据。在快照被获取的时间点,它非常适合快速查看正在发生的情况。

Summary view显示了快照捕获时的内存概览。

Summary 视图还显示了一个内存使用的树状图,可以进行深入挖掘以发现那些占用最多内存的区域。

Summary view还显示了快照捕获时的内存使用情况的树状图。

在树状图视图下方是一个被过滤的表格,它会更新以显示所选单元中的对象列表。

树状图显示了与对象相关的内存,可以是本机对象或托管对象。

相比于本机对象内存,托管对象内存往往相对较小,在树状图中很难被发现。您可以放大树状图来查看这些内容,但对于较小的对象,通常使用表格来提供更好的概览。单击树状图中的单元格将会将下方的表格按照该部分的类型进行过滤,并选择感兴趣的对象在对象和分配视图中进行查看。

在内存快照中,经过筛选的对象表会更新,以显示当前选定的树状图格子中的对象。

你可以通过选择表格或树状图来跟踪引用该列表中的对象以及可能驻留在哪些托管类字段中,然后在详情侧边栏中检查引用部分。如果侧边栏被隐藏,可以通过工具栏右上方的切换按钮使其可见。

详细信息面板包含引用和选择详细信息部分。引用部分显示了在树图或表格中选择的对象的引用。选择详细信息部分包含有关该对象或引用部分中任何选择的对象的详细信息。

注意:树状图仅显示内存中的Objects。它不是对跟踪内存的完整表示。这一点很重要,因此如果你注意到内存使用概述的数字与跟踪内存总数不一致,就要理解这一点。

这是因为并非所有的native memory都与Objects相关联。它还可以包括non-Object-associated的本机分配,例如可执行文件和DLL、NativeArrays等等。甚至更抽象的概念,比如“Reserved but unused memory ”也会影响本机分配的总量。

标签:分析,Profile,Frame,Analyzer,Profiler,Unity,视图,性能,内存
From: https://www.cnblogs.com/flamesky/p/18168073

相关文章

  • Unity游戏框架设计之场景管理器
    Unity游戏框架设计之场景管理器简单介绍在游戏开发过程中,我们经常对Scene进行切换。为了不使场景切换时造成的游戏卡顿,可以Unity官方API利用协程的方式异步加载场景。同时,为提升Scene切换的玩家体验,我们经常会在场景切换的开始,先显示过渡UI,然后才对目标场景进行加载......
  • 【小程序逆向专栏】某润选房小程序逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • linux 系统调用分析
    一、linux系统调用介绍linux系统调用是linux为用户空间与内核空间交换提供的一组标准API,这些api能够让用户态进程访问内核代码,从而实现系统资源、硬件、文件读写的访问。需要注意的是,系统调用是用户态进入内核态的唯一入口,为了保证linux内核运行的稳定性,用户程序不能随意的访问内......
  • 首届超算互联网峰会!天翼云弹性高性能计算E-HPC亮相!
    4月11日,首届超算互联网峰会暨国家超算互联网平台上线仪式在天津顺利举办,来自部委、省级科技厅、中国科学院、中国工程院、计算产业链相关企业等专家、代表数百人共聚一堂,见证了这一历史性时刻。天翼云作为副理事长单位受邀参会,围绕超算领域的前沿技术和应用,与业内专家共同探讨互联......
  • k8s限速队列使用场景分析
    场景1:add->add->get->getpackagemainimport( "fmt" "k8s.io/client-go/util/workqueue")funcmain(){ queue:=workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) queue.Add(100) queue.Add(100) v,_......
  • 社会网络分析及其Python实现
    社会网络分析(SocialNetworkAnalysis,SNA)在人类学、心理学、社会学、数学以及统计学等领域中发展起来,是综合运用图论、数学模型来研究社会行动者之间的关系或通过这些关系流动的各种有形或无形的东西,如信息、资源等,近年来逐渐成为一种热门的社会科学研究方法。社会网络分析旨在......
  • 在Linux中,如何监控磁盘I/O性能?
    在Linux中,可以使用iotop和iostat命令来监控磁盘的I/O性能。以下是如何使用这两个工具以及它们各自的特点:使用iotop命令:iotop是一个实时显示系统磁盘活动的工具,类似于top命令,但专注于I/O活动。它能够展示每个进程或线程的实时I/O使用情况,包括读写带宽,以及等待I/O操作所花费的时......
  • Unity游戏框架设计之任务管理器
    Unity游戏框架设计之任务管理器简单介绍在游戏开发中,我们可能会遇到下述需求。当角色的生命值减少时,我们需要让角色播放受伤动画,让系统播放角色受伤音效,将当前的新的生命值更新到UI上等等操作。如果在角色的代码中直接实现上述的操作,则将导致代码的高度耦合,不利于后期的维护和......
  • Unity游戏框架设计之消息管理器
    Unity游戏框架设计之消息管理器简单介绍消息管理器又可以称为任务管理器,主要解决延迟执行某些代码的问题。比如,我们希望一些代码可以延迟指定的时间后才执行,或者我们希望一些代码可以在固定的时间执行,又或者我们希望一些代码可以每隔一段时间就执行一次。消息管理器就是为了实现......
  • Unity游戏框架设计之协程管理器
    Unity游戏框架设计之协程管理器代码设计/**协程管理器*/publicclassCoroutineManager:SingletonMono<CoroutineManager>{/***创建CoroutineTask*/publicCoroutineTaskCreateCoroutine(IEnumeratorcoroutine,Action<bool>finishHandler......