Arzie100 发表于 2022-7-12 08:14

【Unity Profile】诊断性能问题

前言

整天在讲优化,对Profile的研究却很少,今天刚好要研究一个功能的性能问题,借此研究一下
Profiler 窗口是一个强大的分析工具,内置于 Unity 中。
Ctrl + 7 快捷键打开 Profiler 窗口
通过选择Window > Profiler从顶部菜单栏中打开 Profiler 窗口

一个功能在各种机型下都掉帧,而且是测试资源,特效都没上,性能就不通过,这个要怎么分析性能呢?
首先一般这种都是真机下进行测试,那么我们的Profiler怎么连接上真机呢?
一、Profiler连接真机

1. 打包时候勾选 Development Build 和 Autoconnect Profiler

如果是development build模式打包出来的安装包,在打包的应用中 画面的右下角会有development build的水印,且在切换场景也不会消失

2. USB连接上真机,输入命令 (高亮部分为包名)

adb forward tcp:34999 localabstract:Unity-com.DefaultCompany.TestShareSDK3. 选择Profiler 附加的端口


到此,我们就成功让我们的Profiler,用ADB连上了真机。
二、性能分析

1. 为啥需要分析?

如果我们的游戏运行缓慢、卡顿甚至卡顿,我们就知道我们遇到了性能问题。
在我们尝试解决任何问题之前,我们需要更多地了解导致问题的原因。
不同的问题需要非常不同的解决方案。
如果我们试图猜测哪里出了问题,或者尝试根据其他项目的工作进行更改,我们可能会浪费时间,甚至会使我们的问题变得更糟。
这就是分析的用武之地。
2. 帧率介绍

帧率是衡量游戏性能的标准。在游戏中,一帧就像动画中的一帧;这是我们游戏的静止图像,被绘制到屏幕上。在屏幕上绘制帧称为渲染帧。帧速率或帧的渲染速度以每秒帧数(FPS) 为单位。
对于渲染的每一帧,Unity 必须执行许多不同的任务。
简单来说,Unity 必须更新游戏状态,拍摄游戏快照,然后将该快照绘制到屏幕上。每帧必须执行的任务包括读取用户输入、执行脚本和执行光照计算等。除此之外,还有一些操作可能在单个帧中发生多次,例如物理计算。
当所有这些任务都足够快地执行时,我们的游戏将具有一致且可接受的帧速率。
当所有这些任务都不能足够快地执行时,帧将花费太长时间来渲染并且帧率将会下降。
3. 排除垂直同步

垂直同步,称为VSync ,用于将游戏的帧速率与正在显示的屏幕的刷新率相匹配。
VSync 可以影响我们游戏的帧速率,其效果可以显示在 Profiler 窗口中。
如果我们不确定我们在看什么,它可能看起来像一个性能问题
所以在我们继续之前,我们需要学习如何将 VSync 排除在我们的调查之外。

4. GPU Profiler

渲染是性能问题的常见原因。
在尝试修复渲染问题之前,确定我们的游戏是受 CPU 限制还是受GPU 限制很重要,因为这些情况需要不同的方法。

[*]中央处理单元(CPU)负责确定必须绘制的内容,
[*]图形处理单元(GPU)负责绘制内容。
识别我们的游戏是否受 GPU 限制的最快方法是使用 Unity 的 GPU 使用分析器。
不幸的是,并非所有设备和驱动程序都支持此分析器。
要检查 GPU 使用情况分析器在我们的目标设备上是否可用,我们应该执行以下步骤:

[*]在 Profiler 窗口的左上角,选择Add profiler 。
[*]从下拉菜单中选择GPU 。如果我们的目标设备不支持 GPU 使用分析器,我们将看到一条以“不支持 GPU 分析”开头的消息,其中 GPU 使用分析器通常会显示其数据。


5.1 如果支持,就可以开始分析了
如果 GPU 时间超过 CPU 时间,我们已经确定我们的游戏此时受 GPU 限制。


5.2 如果 GPU 使用分析器不适用于我们的目标硬件
我们通过观察 CPU 使用率来做到这一点。如果我们可以看到 CPU 正在等待 GPU 完成其任务,这意味着我们的游戏是 GPU 绑定的。要确定是否是这种情况,我们可以执行以下步骤:

[*]单击 CPU 使用情况分析器将其选中。
[*]检查 Profiler 窗口底部的区域,该区域显示有关当前所选框架和分析器的详细信息。
[*]从该区域左上角的下拉菜单中选择层次结构。
[*]选择Time ms列以按时间(以毫秒为单位)对函数进行排序。
[*]如果函数 Gfx.WaitForPresent 在 CPU Usage profiler 中占用的时间最长,则表明 CPU 正在等待 GPU。这意味着我们的游戏此时受 GPU 限制。
[*]如果我们发现我们的游戏受 GPU 限制,我们应该阅读修复性能问题的教程:优化 Unity 游戏中的图形渲染。


5. CPU Profiler

5.1 CPU视图耗时分析

我们可以看到如何花费时间的颜色编码细分。不同的颜色代表渲染操作、物理计算等所花费的时间。分析器中的键指示哪些颜色代表哪些任务。
在下面的屏幕截图中,我们可以看到这一帧的大部分时间都花在了渲染操作上。下图底部的 CPU 时间指示器表明我们这一帧的总 CPU 时间为 85.95 毫秒。


5.2 Hierarchy 视图,分析具体函数、比较帧变化

当我们选中一帧的时候,可以展开Hierarchy 视图。更深入地挖掘此信息,并准确查看在此帧期间哪些任务占用的 CPU 时间最多。

[*]Time ms按耗时最长的函数对函数进行排序
[*]Calls按在当前突出显示的帧中调用的次数对函数进行排序
[*]Self ms列表示函数本身花费了多少时间
[*]Time ms表示该函数以及它调用的所有其他函数花费了多少时间。


可以使用 CPU 使用分析器逐帧跟踪单个函数的成本。
选中单个函数,拖动帧,可以逐帧比对函数调用成本
5.3 GC(垃圾收集分析)



如果函数GC.Collect()出现并且占用过多的 CPU 时间,那么我们已经确定我们的游戏存在垃圾收集问题。
5.3.1 解决垃圾收集问题
如果我们发现我们的游戏存在垃圾收集问题,我们应该阅读这篇文章。 5.4. Physics 物理分析




选择 CPU 使用分析器后,选择Time ms列以按时间(以毫秒为单位)对函数进行排序。单击列表顶部的功能以选择它们。
如果它们是物理函数,CPU 分析器图表将突出显示它们作为物理显示的一部分。如果是这种情况,我们已经确定我们当前的性能问题与物理学有关。
5.4.1 解决物理问题

[*]Unity 手册的这一页虽然是为 iOS 开发人员编写的,但有一些适用于所有 Unity 游戏的物理优化技巧。
[*]这篇关于在 Unity 游戏中优化物理的教程包含许多有用的提示。
[*]这个Unite 2012 优化演讲的物理部分包含对常见物理问题的有用总结。
5.5. Script 脚本分析



选择 CPU 使用分析器后,选择Time ms列以按时间(以毫秒为单位)对函数进行排序。单击列表顶部的功能以选择它们。
如果它们是用户脚本函数,CPU 分析器图表将在脚本显示中突出显示它们。如果是这种情况,我们已经确定我们当前的性能问题与脚本有关。
请注意,上述情况有一个例外:如果我们的游戏包含与渲染相关的代码,
例如Image Effects脚本或OnWillRenderObject或OnPreCull函数中的代码,这将在 CPU 使用情况分析器时显示在 Profiler 窗口的顶部作为渲染数据而不是脚本数据。
5.5.1 解决慢脚本问题

[*]Unity 手册中的这一页侧重于优化移动平台的脚本,但该建议对所有开发人员都很有用。
[*]Unity 手册中的此页面包含有关避免在用户脚本中调用昂贵的函数的建议。
[*]这个Unite 2012 关于优化的演讲包含对常见脚本问题的有用总结。
三、总结

几个常见函数总结:
函数分析Gfx.WaitForPresent在 CPU Usage profiler 中占用的时间最长,则表明 CPU 正在等待 GPU。意味着我们的游戏此时受 GPU 限制。WaitForTargetFPS该参数一般出现在CPU开销过低,且通过设定了目标帧率的情况下。当上一帧的耗时低于目标帧率的耗时时,将会在本帧产生一个WaitForTargetFPS的空闲等待耗时,以维持目标帧率。在优化过程中,你对它可以“视而不见”。Gfx.WaitForPresent && Graphics.PresentAndSync这两个参数无论CPU占用多少,其实都不是这两个参数的自身问题,而是项目的其他部分造成。造成这两个参数的CPU占用较高的原因主要有以下三种原因:


[*]CPU开销非常低,所以CPU在等待GPU完成渲染工作或等待VSync的到来;
[*]CPU开销很高,使Present错过了当前帧的VSync,即不得不等待下一次VSync的到来;
[*]GPU开销很高,CPU的Present需要等待GPU上一帧渲染工作的完成。
[*]最后,如何优化并降低这两个参数的CPU占用呢? 那就是,忽略Gfx.WaitForPresent 和 Graphics.PresentAndSync这两个参数,优化其他你能优化的一切!
参考

Diagnosing Performance Problems - Unity Learn
https://unity3d.com/learn/tutorials/topics/mobile-touch/unite-europe-2016-optimizing-mobile-applications?playlist=17138
https://www.youtube.com/watch?v=jZ4LL1LlqF8
扒一扒Profiler中这几个“占坑鬼”
页: [1]
查看完整版本: 【Unity Profile】诊断性能问题