网络知识 娱乐 Unity性能优化之unity profiler

Unity性能优化之unity profiler

Unity profiler 所能收集到的内容

  1. CPU消耗量(包括每一个子系统)
  2. 基本、详细的渲染和GPU的信息
  3. 运行时内存的分配和总消耗量
  4. 音频/数据的使用情况
  5. 物理引擎(2D3D)的使用情况
  6. 网络消息传递和活动情况
  7. 视频回放的使用情况
  8. 基本和享系的用户界面性能
  9. 全局光照同继数据

常用的使用profiler的方法

  1. 指令注入:所谓的指令注入就是通过代码开启一个指令命名,然后在目标函数前开启,目标函数结束关闭,以此来观察目标函数的行为(后面会说到),这里面可能包括,调用次数、总共的执行时间、分配了多少内存、、、
  2. 基准分析:所谓的基准分析就是,当某一个时刻或者某一阶段,性能突然发生变化,如渲染帧率FPS突然增大、总体内存消耗突然增多或者其他指标在表现上突然出现的峰值,那么这个时候就可能存在性能问题

使用时注意事项

  1. profiler可以分析的项目类型有很多,如本地实例、浏览器上运行的WEbGl实例、IOS设备上运行的远程实例、android设备上的远程实例都是可以连接到profiler的 但是需要注意的在打包的时候需要将Development Build 和AutoConnectProfiler标志打开,如下
    在这里插入图片描述

怎样连接到IOS远程实例

  1. 构建项目的时候打开DevelopmentBuild和autoconnect
  2. 设备连接到本地wifi网络
  3. 通过usb将设备连接到MAC上
  4. 和平常一样构建项目
  5. 打开unity 的profiler,在connectplayer中选择要连接的远程实例,如下在这里插入图片描述
  6. 打开profiler就可以看到正在收集的远程实例数据

连接到Android的流程基本类似

profiler 视图

网上有很多这里不再赘述

性能分析的最佳方法

基本流程

  1. 验证目标脚本是否出现在场景中
  2. 验证脚本在场景中出现的次数是否正确
  3. 验证事件的正确顺序

验证目标脚本是否出现在场景中 ,在hierarchy中输入要查找的脚本名称,不区分大小写

在这里插入图片描述
在这里插入图片描述

验证脚本次数

在这里插入图片描述
观察一下调用次数,如果次数比预期的多,可能是在编写代码的时候,发生了多此的创建等情况

验证事件顺序

对于unity的生命周期函数而言其执行顺序是一定的,但是,这种顺序是指在单一的脚本中,如果我在一个awake中初始化了一些数据,在另一个awake中修改了这些数据,那么就可能会发生一些不可预知的错误,为什么?当场景中的对象发生重建或者重组的时候,代码库和编译过程中的随机变化就可能导致这些awake顺序发生变化,所以,永远不要去指望所编写的函数按照预期的顺序去执行,其他的生命周期函数也是同样的道理,但是可以确定的是,awake一定是早于start执行,(包括其他的不同的周期函数,所以对于上述情况来看,可以在awake中初始化数据,在start中进行数据的修改)

如何对代码片段进行针对性的分析呢?

上文已经说了,对于一个出现性能问题的脚本或者代码分析的基本流程,可能有的人会注意到,上文说的分析粒度太大了,而我们平常遇到的问题,基本上是某个函数,或者某个语句所导致的性能问题,那么怎样才能将粒度具体到某个函数或者某个语句呢?

两类方法

  1. 从代码脚本控制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类进行计时,网上有很多关于这个类的使用方法,这里不再赘述

博客仅为总结个人学习,欢迎留言