这是我在《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.时间轴视图
显示运行期间收集的分析数据,将其组织到一系列区域中
当选中一个区域时,在选中帧的细分视图中,会显示子系统的更多详细信息
单击时间轴视图的图形部分,会显示一条垂直的白线,说明选中了哪一帧
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)]