Unity6性能优化(9)——基础——重新认识Profiler


 

Profiler在Unity6中新增的功能

  • Unity6新增了Highlights模块
    • 它用来显示应用是否达到了其目标帧率、其性能是否受到CPU或GPU限制的信息,可以作为CPU Bound还是GPU Bound的瓶颈判断
    • 使用它需要开启子模块,并在Preferences-Analysis-Profiler下设置目标帧率,因为在不同目标帧率下应用的瓶颈可能发生改变

  • 另外一个新增的是Inverted Hierarchy,它可以按照堆栈调用的反顺序,将函数堆栈列出,不需要一个个展开函数堆栈,就可以快速方便地定位到性能函数了

  • 打开对应的Related Data或 调用 可以看到详细信息中堆栈的显示也是反顺序的

Profiler在Unity6和2022都有但容易被忽略的功能

  • 子模块部分,默认情况下不开启的GPU Usage、File Access及Asset Loading模块,有时可以帮助我们发现大的问题
  • GPU模块因为兼容性问题,只针对一些特殊平台或芯片起作用,一般情况下会使用第三方的工具来做GPU的Profiler
  • 而File Access及Asset Loading模块在一些大世界游戏中,对资源的Streaming性能处理会有很大帮助,如在角色移动时需要检查这两个模块的数据,确定哪些资源是由于跨区域被加载或卸载,加载或卸载量对IO有多大影响。还需要在角色静止不动时检查是否有资源仍然在做Streaming处理,防止不合理的IO问题带来性能影响

  • 我们还可以自定义模块,添加引擎默认集成采样的Mark标记或者Count函数,通过他们Profilling更多数据
  • Mark标记函数或Count函数也是可以自定义拓展的,可以使用Unity Profilling Core API接口(PackageManager中同名包),添加自己逻辑模块对应的Mark与Count函数,Unity文档中有详细的说明与示例代码

  • Profiler的Callback设置,由于引擎Native的一些性能采样会带来巨大的Profilling Overhead开销,所以引擎只对少数关键逻辑做了Callback的采样

  • 这里有3种关键操作

    • GC分配
    • Unsafe的Malloc分配
    • JobHandle的Complete同步的操作
  • 它们都是性能热点的位置

  • 建议在做普通的Profilling时不开启任何Callback,只在这些操作有严重性能影响时再开启Callback按钮,否则Profilling本身的过程也是对性能有影响的

  • 不开启的情况下,我们只能看到哪些地方有这些Callback的操作

  • 而一旦开启后,可以查看这些热点具体的堆栈调用情况,可以更方便地去查找哪里的代码产生了这些类型的操作


  • 在Timeline视图下,右侧的三个点下有两个选项
  • 一个是显示完整的脚本方法名,勾上可显示具体的函数名与所属模块
  • 另一个勾上后可以在Timeline视图中看到Job的调用流程,方便Profiler多Job并行逻辑

  • 最后,还有一个色盲模式,来帮助特殊的开发者