ios - iOS 应用程序的“捕获 GPU 帧”第一帧

标签 ios xcode metal

我的应用程序在第一帧上执行多个渲染操作(我使用的是 Metal,尽管我认为这同样适用于 GLES)。例如,它渲染到在后续帧中使用的目标,但之后不会更新。我正在尝试从这些渲染操作中调试一些绘制调用,并且我想使用“GPU 捕获帧”功能来执行此操作。我过去用它来进行按需 GPU 帧调试,它非常有用。

不幸的是,我似乎找不到捕捉第一帧的方法。例如,此选项在调试器中中断时不可用(在第一帧之前设置断点)。一旦调试开始,Xcode 行为似乎也不允许捕获帧。在 Metal API 或 CAMetalLayer 中似乎甚至没有用于执行 GPU 捕获的 API。

有人成功过吗?

最佳答案

我又遇到了这个问题,现在已经弄明白了。我会将其添加为单独的答案,因为它与我的其他答案完全不同。

首先,一些背景。捕获 GPU 帧包含三个组成部分:

  1. 告诉 Xcode 您想要捕获 GPU 帧。在典型的记录使用中,您可以通过单击 Xcode 中的 GPU Frame Capture“相机”按钮手动执行此操作。
  2. 指示要捕获的下一帧的开始。通常,这发生在MTLCommandBuffer presentDrawable: 出现时,它被调用以将帧缓冲区呈现给底层 View 。
  3. 指示正在捕获的帧的结束。通常,这发生在 next-but-one 出现 MTLCommandBuffer presentDrawable: 时。

在捕获第一个 帧或第一帧之前 的事件时,只有第三个可用,因此我们需要备用执行前两项的方法:

  1. 要告诉 Xcode 开始捕获帧,请在 Xcode 中的某行代码的某行添加一个断点之前您要开始捕获帧的点。右键单击断点,从弹出菜单中选择Edit Breakpoint...,然后向断点添加一个Capture GPU Frame操作:

    enter image description here

  2. 要指示要捕获的帧的开始,第一次出现 MTLCommandBuffer presentDrawable: 之前,您可以使用 MTLCommandQueue insertDebugCaptureBoundary方法。例如,您可以在实例化 MTLCommandQueue 后立即调用此方法,以立即开始捕获提交到队列的所有内容。确保在调用此代码之前触发第 1 项中的断点。

  3. 要指示捕获帧的结束,您可以依赖 MTLCommandBuffer presentDrawable: 的第一次正常出现,或者您可以添加 MTLCommandQueue insertDebugCaptureBoundary< 的第二次调用.

最后,MTLCommandQueue insertDebugCaptureBoundary 方法实际上不会导致帧被捕获。它只是标记了一个边界点,因此您可以将其保留在代码中以供将来调试使用。如果您希望它从生产代码中消失,请将其包装在 DEBUG 编译条件中。

关于ios - iOS 应用程序的“捕获 GPU 帧”第一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32719796/

相关文章:

ios - 谷歌身份验证时苹果应用被拒绝(元数据)

ios - 根据 iOS 6 通讯录使用文档,第 22 条规则

ios - 没有内容和适当背景颜色的 SKScene 加载

ios - 警告“开发人员工具访问需要控制另一个进程才能继续调试。输入您的密码以允许此操作。”

objective-c - 如何为项目中的单个文件禁用 ARC?

swift - SceneKit Cocoa快照声明失败

objective-c - iOS 应用程序中的 TreeView

swift - 归档项目卡了几个小时

swift - 从 MTKView 创建的 UIImage 导致颜色/不透明度差异

swift - 具有多个命令编码器的无内存纹理