「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
概述
为了了解计算机是如何运行 App 或调试问题,通常要使用调试器。传统的调试器通过暂停一个线程来工作,但对基于 Metal 的 App 效果不佳。 Xcode 通过帧捕获工作流专门为 Metal 提供一个调试器。
要使用 Metal 调试器来调试 Metal App,需要捕获单个动画帧,并检查 App 生成该帧的命令。
在本文中,将通过 Xcode 的 Metal 调试器运行《 Metal 框架之渲染管线渲染图元 》 示例,以了解如何在运行时检查 Metal App。
在 Xcode 项目中启用 Metal 调试器
为了调试着色器的源代码,需要在构建设置里面更改 Metal 编译器选项。选项 “Produce debugging information” 下 Debug 设置为 “Yes, include source code”,Release 下的 需要设置为 NO。
捕捉一帧
Metal Debugger 需要与 Xcode 的 Metal 帧捕获功能结合使用,要使用 Metal Debugger,首先要使用以下步骤捕获帧。
构建并运行《 Metal 框架之渲染管线渲染图元 》,App 显示一个三角形。
在 App 运行的情况下,单击 Xcode 调试工具栏上的相机图标:
查看绘图调用
《 Metal 框架之渲染管线渲染图元 》中 App 调用 drawPrimitives(type:vertexStart:vertexCount:) 来绘制一个三角形。 调试的时候, Xcode 会捕获此绘制调用以及其他函数调用,并将它们显示在 Debug 导航器中,如下所示:
如果渲染到了错误的位置或者颜色值不对,可以通过捕获的帧获取更多的信息来定位原因。
MyRenderEncoder 组下的调用,是 Metal 创建三角形而执行的命令。 Xcode 会记录调用,比如设置视口、渲染管线状态、顶点函数参数以及绘制三角形等命令。通过单击组下的某一项就相应的选中了该命令调用。
在主视图中,绘制调用的详细信息划分为多个类别:Vertex、Fragment 和 Attachment。
每一项代表绘制调用的一个阶段,通过更详细地分析这些阶段以找出问题的原因。
在几何查看器中检查顶点
顶点阶段显示一组顶点,这些顶点对应 App 中的图元,也称为网格或几何图形。要直观地检查此数据是否存在任何问题,请双击几何图形。
在几何图形查看器中 Xcode 渲染了顶点阶段输出的线框。在其下方,Xcode 在表格中列出了相同的数据。单击线框中的一个顶点,Xcode 会在表中选择其对应的行。
通过这种方式检查顶点信息,可以从视觉和数字上来确认顶点输出是否正确。
如果屏幕上有错位的顶点,则错误可能出在提供给顶点函数的数据中。Bound Resources 还列出了顶点阶段的输入,通过使用面板中的向左导航来检查是否有任何差异。
查看 Xcode 顶部列出的顶点函数的输入。
双击第一个顶点缓冲区,Xcode 会在表格中显示缓冲区的内容。
每一行标识一个顶点,包括它的位置和颜色。 Xcode 在顶点数字颜色数据的右侧呈现颜色预览。如果此表反映了不期望的值,需要调整 App 中顶点数据的代码或其他资源来解决问题。
在着色调试器中查看顶点函数
如果 App 中一个或多个顶点位置或颜色不正确,则顶点着色器代码有可能错误。为了确定原因,在着色调试器中使用以下步骤打开顶点函数:选中一个顶点(由下图中的标注 1 标记)并单击“调试”按钮(由标注 2 标记)。
上述操作后,Xcode 会在着色调试器中显示顶点函数的源代码。
确保打开的是期望的着色器代码,如果不是,则表明使用了错误的渲染管道,或者错误地配置了渲染管道。
在每一行代码旁边,着色调试器显示了 GPU 执行该行时计算和存储的值。
单击下图中标注 1 处的点,Xcode 会展开显示多个顶点的计算值,如标注 2。
通过这种操作,能够比较出同一帧中所有顶点函数调用的结果。如果发现不一致,表明着色器代码或输入数据存在错误。
在着色器调试器中查看片元函数
还可以查看片元函数是如何处理特定片段的。通过查看 Xcode 辅助编辑器中显示的附件,能够知道片元着色器中的每一行代码是如何确定像素的输出颜色的。
单击并按住鼠标直到 Xcode 显示目标十字线,然后移动鼠标选择一个像素。
点击 “Debug” 按钮。
Xcode 会在着色调试器中打开片元函数,代码行后会显示计算后的像素值。
确保打开的是期望的着色器代码。如果不是,则有可能使用了错误的渲染管道或者错误地配置了渲染管道。
单击计算值右侧的点,在下图中用标注 1 标记。 Xcode 显示该像素点颜色,在下图中由标注 2 标记。
如果片元函数有多行代码,则可以使用类似的方式检查其他行,以此来查看每行如何影响输出像素颜色。
Metal 提供了许多其他很棒的工具,可以使用它们来调试和优化 App 的性能和耗电量。
总结
本文主要介绍使用 Xcode 中的 Metal Debugger 工具,来逐步查看 App 在 GPU 上执行的各种状态。从 Xcode 配置,到如何单步调试都做了详细的讲解,并在关键环节配上了图文描述,方便帮助你快速入门。