Unity profiler 所能收集到的内容
- CPU消耗量(包括每一个子系统)
- 基本、详细的渲染和GPU的信息
- 运行时内存的分配和总消耗量
- 音频/数据的使用情况
- 物理引擎(2D\3D)的使用情况
- 网络消息传递和活动情况
- 视频回放的使用情况
- 基本和享系的用户界面性能
- 全局光照同继数据
常用的使用profiler的方法
- 指令注入:所谓的指令注入就是通过代码开启一个指令命名,然后在目标函数前开启,目标函数结束关闭,以此来观察目标函数的行为(后面会说到),这里面可能包括,调用次数、总共的执行时间、分配了多少内存、、、
- 基准分析:所谓的基准分析就是,当某一个时刻或者某一阶段,性能突然发生变化,如渲染帧率FPS突然增大、总体内存消耗突然增多或者其他指标在表现上突然出现的峰值,那么这个时候就可能存在性能问题
使用时注意事项
- profiler可以分析的项目类型有很多,如本地实例、浏览器上运行的WEbGl实例、IOS设备上运行的远程实例、android设备上的远程实例都是可以连接到profiler的 但是需要注意的在打包的时候需要将Development Build 和AutoConnectProfiler标志打开,如下
怎样连接到IOS远程实例
- 构建项目的时候打开DevelopmentBuild和autoconnect
- 设备连接到本地wifi网络
- 通过usb将设备连接到MAC上
- 和平常一样构建项目
- 打开unity 的profiler,在connectplayer中选择要连接的远程实例,如下
- 打开profiler就可以看到正在收集的远程实例数据
连接到Android的流程基本类似
profiler 视图
网上有很多这里不再赘述
性能分析的最佳方法
基本流程
- 验证目标脚本是否出现在场景中
- 验证脚本在场景中出现的次数是否正确
- 验证事件的正确顺序
验证目标脚本是否出现在场景中 ,在hierarchy中输入要查找的脚本名称,不区分大小写
验证脚本次数
观察一下调用次数,如果次数比预期的多,可能是在编写代码的时候,发生了多此的创建等情况
验证事件顺序
对于unity的生命周期函数而言其执行顺序是一定的,但是,这种顺序是指在单一的脚本中,如果我在一个awake中初始化了一些数据,在另一个awake中修改了这些数据,那么就可能会发生一些不可预知的错误,为什么?当场景中的对象发生重建或者重组的时候,代码库和编译过程中的随机变化就可能导致这些awake顺序发生变化,所以,永远不要去指望所编写的函数按照预期的顺序去执行,其他的生命周期函数也是同样的道理,但是可以确定的是,awake一定是早于start执行,(包括其他的不同的周期函数,所以对于上述情况来看,可以在awake中初始化数据,在start中进行数据的修改)
如何对代码片段进行针对性的分析呢?
上文已经说了,对于一个出现性能问题的脚本或者代码分析的基本流程,可能有的人会注意到,上文说的分析粒度太大了,而我们平常遇到的问题,基本上是某个函数,或者某个语句所导致的性能问题,那么怎样才能将粒度具体到某个函数或者某个语句呢?
两类方法
- 从代码脚本控制profiler
可以通过profiler类在脚本中控制profilier,使用UnityEngine.profiling.profiler类的BeginSample和EndSampler方法来访问,示例如下
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
text();
}
}
void text()
{
Profiler.BeginSample("my profiler sample");
for(int i = 0; i <10;i++)
{
Debug.Log("按下a");
i += 0;
}
Profiler.EndSample();
}
因为我是在函数里面,for循环的外面开始,循环结束之后,停止,也就是说,这个my profiler sample代表的就是这个for循环执行所消耗的资源,如果在函数外开始,函数执行完毕结束的话,代表的就是整个函数执行所消耗的资源 2. 自定义定时和日志记录的方法 使用StopWatch类进行计时,网上有很多关于这个类的使用方法,这里不再赘述
博客仅为总结个人学习,欢迎留言
|