封面来自霍格沃茨之遗

前不久我的Windows开发机炸了,手上只有一台公司配发的MacBook M1 Pro

习惯在Windows下用RenderDoc调试的我,突然就懵逼了

首先拒绝UnityEditor自带的FrameDebugger,这货在抓URP相关的Event经常会抓不到指定的Tick表现为层级试图闪烁,在暂停编辑器的情况下只能相对改善,无法解决。

接着打开RenderDoc主页没有MacOS的版本下载

脑中闪过自己拿源码编译一个Mac版本,但是似乎RenderDoc不支持Metal截取,直接放弃

那么就剩下2个方案

1.编写NativePlugin,嵌入MTLCaptureManager相关代码

2.UnityEditor发布项目到XCode工程,在XCode Debug工程时FrameCapture

但是这2种方案都非常繁琐,是否有直接在编辑器上截取调试的方法呢。

摸索了一番,发现有的,但是有坑!!!

官方文档

Xcode frame debugger Unity integration

翻译过来

1.创建一个空工程

2.Scheme 打开Info标签

3.设置可执行文件为UnityEditor

4.根据文档开启FrameCapture

5.设置启动参数,如果有UnityHub需要特别设置

我们照着做一遍

1.打开XCode创建一个XCodeProject

选择创建一个 MacOS Command Line Tool

产品名称随便取一个,语言选择C++

之后选择工程保存路径,之后就打开工程

2.略

从第3步开始就是坑了

如果你是M1 芯片的Mac 那么一定不要下载SILICON的版本,一定要下载Intel的版本

M1 配合SILICON版本的编辑器虽然可以提升性能,省电。 但是无法触发截帧!!!!!

第4步也有坑

GPU FrameCapture的选项不要选择Automatically,直接选Metal

第5步的坑估计只有国内版用户才会踩

国内用户启动编辑器必须通过UnityHub启动,文档说Executable设置为 UnityHub.app

错误的设置

实际测试 UnityHub.app 加上 启动参数 projectPath 是无法拉起项目的。而应该直接设置为UnityEditor.app

正确的设置

最后设置下项目启动路径

点击Xcode启动项目,XCode会自动拉起Unity

同时在Game视窗出现了我们期待已久的“相机”图标

勇敢的点下去!

点击之后,UnityEditor会进入冻结状态,回到XCode会看到FrameCapture已经截取了一帧了

接下来我们试试XCode的修改ShaderCode代码功能

1.先找到绘制Cube的DrawCall

2.找到这个DrawCall用到的Fragment Function双击打开

在Shader中加入一行测试代码 让输出颜色仅仅输出r通道

然后点击“箭头“指向的刷新按钮,可以看到右上角的Cube立刻变成红色了!

调试完成,我们需要点击编辑器的“继续”按钮让UnityEditor解除冻结状态

大功告成

XCode的分析功能比RenderDoc要强大很多,包括各个Draw的功耗带宽耗时指令等等,非常全面。