这是我在《Unity游戏优化 (第2版)》看的,记录一下~

Unity Profiler 是啥?
是内置的一种方便的方法,通过在运行时为大量的Unity3D子系统生成使用情况和报告统计,来缩小性能瓶颈的搜索范围

可以给不同的子系统收集如下数据:
1.CPU消耗量(每个主要子系统)
2.基本和详细的渲染和GPU信息
3.运行时内存分配和总消耗量
4.音频源/数据的使用情况
5.物理引擎(2D和3D)的使用情况
6.网络消息传递和活动情况
7.视频回放的使用情况
8.基本和详细的用户界面性能
9.全局光照统计数据


通常有两种使用Profiler工具的方法:
1.指令注入(instrumentation)
2.基准分析(benchmarking)

通过观察目标函数调用的行为,在哪分配了多少内存,来密切观察应用程序的内部工作情况
(本身也会带来一定损耗)
(如果是在unity编辑器中进行分析的,会消耗更多的CPU和内存,因为需要更新界面,渲染额外的窗口)

Unity在开发模式(BuildSetting里面的 Development Build 标识决定),会启用附加编译标识,导致应用程序运行时生成特殊事件,这些事件会被分析器记录并存储

所以在分析之前,应该先体验一段程序本来的体验,在性能明显变差的时候再持续关注一段时间。
这个操作叫 基准分析 ,通常重要指标是:渲染帧率(Frames Per Second,FPS)、总体内存消耗和CPU活动的行为方式(寻找活动中较大的峰值),以及CPU/GPU的温度。
因为这些用户感知都是比较明显的,我们看起来也很明显,能节省大量时间

并且不要在Editor模式下生成的数据作为基准数据,因为Editor模式会带来一定额外开销,
也可能会比独立app更快,比如:序列化数据(音频文件、预制块和Scriptable Object)


窗口介绍:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3HuwzY2o-1619018927482)(https://upload-images.jianshu.io/upload_images/19031468-06fe81f511b73935.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

1.Profiler控件
顶部的选项栏,包括多个下拉和开关按钮
作用:决定要分析什么数据,以及在每个子系统中收集数据的深度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lRXy8lkn-1619018927485)(https://upload-images.jianshu.io/upload_images/19031468-eaec0681f340b4c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

AddProfiler
添加额外区域的

Record
启用会记录数据(只有运行才能记录)
如果开启了 Profile Editor 则收集的是编辑器的数据

DeepProfile
普通的分析只记录常见的Unity回调(Awake、Start、Update和FixUpdate)所返回的时间和内存分配信息
启用 Deep 选项可以用更深层次的指令重新编译脚本,允许它统计每个调用方法
(会导致指令注入成本比正常情况要大很多,并要使用大量内存,因为运行时收集的是整个调用堆栈的数据)
并且需要完全重新编译整个项目,才能开始分析,避免在测试中来回切换

无需在大多数测试用启用这个
一般在默认的无法提供足够详情以指出问题根源时,启用这个选项
当发现问题了,确定成小场景性能的时候,可以使用这个选项来隔离某种行为

Profile Editor
收集编辑器本身的数据(主要是针对编辑器脚本)

Connected Player
选择要分析的实例

Clear
清楚当前时间轴视图种德所有分析数据

Load
加载之前保存过的Profiler数据

Save
将当前显示在时间视图上的所有Profiler数据保存到文件中。
一般性能出现峰值的时候,暂停应用并保存数据,以便后续分析

帧选择
FrameCounter,显示已经分析了多少帧以及当前时间轴中选的了那一帧

2.时间轴视图
显示运行期间收集的分析数据,将其组织到一系列区域中
当选中一个区域时,在选中帧的细分视图中,会显示子系统的更多详细信息
单击时间轴视图的图形部分,会显示一条垂直的白线,说明选中了哪一帧

unity Memory Profiler 真机调试 unity profiler在哪_外链

3.细分视图控件栏
根据时间轴选的区域,显示不同的下拉框和切换按钮选项

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XfxIW4uR-1619018927489)(https://upload-images.jianshu.io/upload_images/19031468-3fb0979665eb7847.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

4.细分视图
根据时间轴选择的区域,显示不同的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X2sRUhr2-1619018927491)(https://upload-images.jianshu.io/upload_images/19031468-a8313e0bfb033512.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

当为CPU使用区域时,显示CPU所有使用情况和统计数据
(比较复杂,但是很有用的。因为包括了Unity大量子系统和MonoBehaviour组件、相机、物理、渲染、用户界面、音频处理、Profiler等)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdOyfkrN-1619018927492)(https://upload-images.jianshu.io/upload_images/19031468-a826e5b3512a950a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

还有三种不同的模式:
a.Hierarchy 模式
合并类似的数据元素和Unity的全局函数调用
BeginGUI() 和 EndGUI() 会合并到一起
用途:看一下哪个函数调用会花费最多的时间

b.Raw Hierarchy 模式
不会合并
用途:统一某个全局方法调用了多少次

c.Timeline 模式
垂直组织到不同的部分,代表运行时的不同线程
水平轴表示时间,宽方块消耗的CPU时间更多

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mwt96hbU-1619018927494)(https://upload-images.jianshu.io/upload_images/19031468-eabf4b2c8f7811be.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]