Metal 框架之使用 Metal Debugger 查看 GPU 工作负载

「这是我参与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。 启用调试器.png

捕捉一帧

Metal Debugger 需要与 Xcode 的 Metal 帧捕获功能结合使用,要使用 Metal Debugger,首先要使用以下步骤捕获帧。

构建并运行《 Metal 框架之渲染管线渲染图元 》,App 显示一个三角形。

三角形.png

在 App 运行的情况下,单击 Xcode 调试工具栏上的相机图标:

相机图标.png

查看绘图调用

《 Metal 框架之渲染管线渲染图元 》中 App 调用 drawPrimitives(type:vertexStart:vertexCount:) 来绘制一个三角形。 调试的时候, Xcode 会捕获此绘制调用以及其他函数调用,并将它们显示在 Debug 导航器中,如下所示:

调用命令的显示.png

如果渲染到了错误的位置或者颜色值不对,可以通过捕获的帧获取更多的信息来定位原因。

MyRenderEncoder 组下的调用,是 Metal 创建三角形而执行的命令。 Xcode 会记录调用,比如设置视口、渲染管线状态、顶点函数参数以及绘制三角形等命令。通过单击组下的某一项就相应的选中了该命令调用。

调用命令.png

在主视图中,绘制调用的详细信息划分为多个类别:Vertex、Fragment 和 Attachment。

划分多类别.png

每一项代表绘制调用的一个阶段,通过更详细地分析这些阶段以找出问题的原因。

在几何查看器中检查顶点

顶点阶段显示一组顶点,这些顶点对应 App 中的图元,也称为网格或几何图形。要直观地检查此数据是否存在任何问题,请双击几何图形。

几何查看器检查顶点.png

 在几何图形查看器中 Xcode 渲染了顶点阶段输出的线框。在其下方,Xcode 在表格中列出了相同的数据。单击线框中的一个顶点,Xcode 会在表中选择其对应的行。

几何线框.png

通过这种方式检查顶点信息,可以从视觉和数字上来确认顶点输出是否正确。

如果屏幕上有错位的顶点,则错误可能出在提供给顶点函数的数据中。Bound Resources 还列出了顶点阶段的输入,通过使用面板中的向左导航来检查是否有任何差异。

向左导航栏.png

查看 Xcode 顶部列出的顶点函数的输入。

顶点输入.png

双击第一个顶点缓冲区,Xcode 会在表格中显示缓冲区的内容。

缓冲区的内容.png

每一行标识一个顶点,包括它的位置和颜色。 Xcode 在顶点数字颜色数据的右侧呈现颜色预览。如果此表反映了不期望的值,需要调整 App 中顶点数据的代码或其他资源来解决问题。

在着色调试器中查看顶点函数

如果 App 中一个或多个顶点位置或颜色不正确,则顶点着色器代码有可能错误。为了确定原因,在着色调试器中使用以下步骤打开顶点函数:选中一个顶点(由下图中的标注 1 标记)并单击“调试”按钮(由标注 2 标记)。

调试器查看函数.png

上述操作后,Xcode 会在着色调试器中显示顶点函数的源代码。

着色器源码.png

确保打开的是期望的着色器代码,如果不是,则表明使用了错误的渲染管道,或者错误地配置了渲染管道。

在每一行代码旁边,着色调试器显示了 GPU 执行该行时计算和存储的值。

计算和存储的值.png 单击下图中标注 1 处的点,Xcode 会展开显示多个顶点的计算值,如标注 2。

展开计算值.png

通过这种操作,能够比较出同一帧中所有顶点函数调用的结果。如果发现不一致,表明着色器代码或输入数据存在错误。

在着色器调试器中查看片元函数

还可以查看片元函数是如何处理特定片段的。通过查看 Xcode 辅助编辑器中显示的附件,能够知道片元着色器中的每一行代码是如何确定像素的输出颜色的。

片段调试器.png

单击并按住鼠标直到 Xcode 显示目标十字线,然后移动鼠标选择一个像素。

选择像素.png

点击 “Debug” 按钮。

Debug按钮.png

Xcode 会在着色调试器中打开片元函数,代码行后会显示计算后的像素值。

计算后的像素值.png

确保打开的是期望的着色器代码。如果不是,则有可能使用了错误的渲染管道或者错误地配置了渲染管道。

单击计算值右侧的点,在下图中用标注 1 标记。 Xcode 显示该像素点颜色,在下图中由标注 2 标记。

显示颜色.png

如果片元函数有多行代码,则可以使用类似的方式检查其他行,以此来查看每行如何影响输出像素颜色。

Metal 提供了许多其他很棒的工具,可以使用它们来调试和优化 App 的性能和耗电量。

总结

本文主要介绍使用 Xcode 中的 Metal Debugger 工具,来逐步查看 App 在 GPU 上执行的各种状态。从 Xcode 配置,到如何单步调试都做了详细的讲解,并在关键环节配上了图文描述,方便帮助你快速入门。

本文示例代码下载

Guess you like

Origin juejin.im/post/7032672507694055431