前言

最近除了拼UI之外也在断断续续做着渲染性能优化工作,其实这块内容说难也不难,说简单肯定也不简单,不难是因为当今Profiler工具相当完善,甚至可以精确到每一条Shader汇编指令的耗时,XCode还可以给出优化建议,不简单是因为很多时候就算得知了性能热点,但却不知道如何下手,因为需要掌握的知识很多,比如要会看Nvidia,OpenGL,Vulkan等后端API的汇编码,要知道做了优化操作之后对渲染流程中各个模块的影响,比如为了减少OverDraw把Alpha Blend改成Alpha Test,Early-z会不会失效,在移动平台是不是性能更高,还有些情况让人纠结,比如优化了下ALU耗时,带宽又上去了。

对于老手来说可能一行代码写下来,什么带宽,ALU耗时,精度转换,甚至汇编码都知道是什么个情况了,对于新手来说,就得老老实实对着Profiler工具慢慢看,慢慢调。当然这是少数情况了,大部分情况下老手们依旧要看Profiler,因为谁也捉摸不透不同的GPU架构和指令集会做出怎么样的优化(负优化),所以于情于理Profiler工具的学习还是很必要的。

目前用下来感觉最好用的移动平台Profiler工具有三个

  • Renderdoc (全平台通用,AMD平台还支持查看更加详尽的数据例如ALU消耗,读写带宽等)
  • Snapdragon (高通晓龙专用)
  • XCode (果子爹Metal专用)

Renderdoc

Renderdoc的文档相当详尽,完全可以跟着官网教程走一遍,然后根据自己的需要再仔细查看特定模块的使用方法

也有同好整理了中文版文档,可以用于快速预览

注意点

由于GPU时钟频率是不断变化的,所以每次点击

image-20211126193058988

获取的耗时是浮动的,所以我们要多点击几次,取平均值

Snapdragon

界面比Renderdoc美观许多,并且有可视化曲线图可以辅助观测性能变化,美中不足的是它支持的机型覆盖率感觉不是特别高,同事的小米10可以跑,我的华硕ROG就跑不了(同样是高通骁龙)

XCode

XCode使用起来手感最佳,并且随着XCode的更新迭代,现在进行Profiler已经不需要像之前那样跑去官网申请开发者账号这么麻烦了,直接可以在XCode中一气喝成

XCode开发者账号配置

打开XCode后点击菜单栏Xcode -> Preferences… -> Account -> 添加自己AppId (也会作为我们的TeamId) -> Manage Certificates -> 添加App Development

Unity打包

切换至IOS平台,配置Run in Xcode(如果没自动识别就手动配置Xcode目录),设置Debug模式 + DevelopmentBuild

image-20211203115005235

打开BuildSetting,填写TeamId(AppId),勾选Automatically Sign

image-20211203115034921

随后回到构建窗口,点击Build即可

他会输出xcode工程至你选择的目录,随后使用XCode打开这个目录

IOS手机连接

手机连接后会显示是否信任此电脑,点击是即可

XCode工程配置

点击工程的根目录图标,配置Signing & Capabilities

  • 勾选Automatically Sign
  • Team选择我们配置的自己的开发者账号
  • Bundle Identifier需要配置一个唯一的字符串,不能用默认的

如果此时依旧有报错,可以无视,大概率是我们刚申请的开发者账号还没刷新,不影响使用,点击左上角的开始按钮即可开始构建安装包到IOS手机

Profiler

选中像喷漆一样的图标,然后点击M图标即可进行一帧的抓取

image-20211203115249723

更加具体的内容可以参见知乎上几篇使用说明,虽然也有疏漏,但是XCode功能雀氏很多,很难一篇文章讲的干干净净,剩下的就自己摸索吧,反正是傻瓜式工具,看哪里没点过就点哪里

image-20211203115213841

总结

Profiler工具介绍完了,现在总结一下通用注意点

  • 任何Profiler工具的耗时都需要结合当前GPU的频率去计算得出真正的耗时,比如某个draw耗时3ms,但是GPU频率只达到满血的一半,那么其实这个draw耗时可以大胆压缩30%~40%左右,之所以不是100%一方面是因为draw耗时有多个模块组成,另一方面是因为我们为了保证发热量,不会让GPU满载,一般跑到13~14ms就差不多到极限了。当然了如果就是想测满血性能,那就把场景搞得复杂一点,让GPU耗时超过16.6ms即可

引用