Unity性能优化之unity profiler

Unity profiler 所能收集到的内容

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

常用的使用profiler的方法

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

使用时注意事项

  1. profiler可以分析的项目类型有很多,如本地实例、浏览器上运行的WEbGl实例、IOS设备上运行的远程实例、android设备上的远程实例都是可以连接到profiler的 但是需要注意的在打包的时候需要将Development Build 和AutoConnectProfiler标志打开,如下
    Unity性能优化之unity profiler_第1张图片

怎样连接到IOS远程实例

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

连接到Android的流程基本类似

profiler 视图

网上有很多这里不再赘述

性能分析的最佳方法

基本流程

  1. 验证目标脚本是否出现在场景中
  2. 验证脚本在场景中出现的次数是否正确
  3. 验证事件的正确顺序
验证目标脚本是否出现在场景中 ,在hierarchy中输入要查找的脚本名称,不区分大小写

在这里插入图片描述
Unity性能优化之unity profiler_第3张图片

验证脚本次数

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

验证事件顺序

对于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();
    }

Unity性能优化之unity profiler_第4张图片
因为我是在函数里面,for循环的外面开始,循环结束之后,停止,也就是说,这个my profiler sample代表的就是这个for循环执行所消耗的资源,如果在函数外开始,函数执行完毕结束的话,代表的就是整个函数执行所消耗的资源
2. 自定义定时和日志记录的方法
使用StopWatch类进行计时,网上有很多关于这个类的使用方法,这里不再赘述

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

你可能感兴趣的:(性能优化,unity,性能优化,游戏引擎)