使用Metal调试器查看GPU工作负载
使用Xcode中的各种Metal工具在GPU上逐步检查应用程序的状态。
Overview
要了解计算机如何运行应用程序或调试问题,通常使用调试器。传统的调试器是通过在一个线程上暂停来工作的,但是对于Metal应用程序来说,这并不能很好地工作。Xcode通过其“帧捕获(frame capture)”工作流为Metal提供了一个调试器。
要使用Metal调试器调试Metal应用程序,可以捕获一个动画帧并检查应用程序生成的命令来创建它。
在本文中,您将通过Xcode的Metal调试器运行 Using a Render Pipeline to Render Primitives,了解如何在运行时检查Metal应用程序。
Enable the Metal Debugger in the Xcode Project
在Xcode项目中启用Metal调试器
在渲染示例中,到项目的build settings中,并更改Metal编译器选项,以便调试包括着色器源代码的信息。将调试的“Produce debugging information”设置为“Yes, include source code”。
发送给客户的应用程序不应该包含调试信息,所以将Release设置为No。
Capture a Frame
捕获帧
Metal调试器与Xcode的Metal帧捕获功能一起工作。要使用Metal调试器,首先使用以下步骤捕获帧。
构建并运行您的项目。在Using a Render Pipeline to Render Primitives示例中,应用程序将显示一个三角形。
在应用程序运行时,返回Xcode并单击调试工具栏上的摄像头图标:
个人笔记:
摄像头图标闪烁时触发绘制,如果未在Degug Navgator中显示调用过程的话,尝试重复触发绘制。
Inspect Your Draw Call
检查你的绘制调用
Using a Render Pipeline to Render Primitives通过调用drawPrimitives(type:vertexStart:vertexCount:)绘制一个三角形。Xcode捕获这个draw调用和您在框架中进行的所有其他函数调用,并在Debug navigator中显示这些调用,如下所示。
如果您的绘图调用以错误的颜色或屏幕位置呈现,则可以在捕获的帧中对其进行识别,以获取有关原因的更多信息。
MyRenderEncoder组显示Metal执行以创建三角形的命令。 Xcode记录您的调用,以设置视口,渲染管道状态,顶点函数的参数以及最后一个绘制三角形的命令。单击绘图调用将其选中。
在主视图中,Xcode向您显示绘制调用的详细信息,这些调用分为以下类别:“顶点Vertex”,“片段Fragment”和“附件Attachment”。
每一个都代表一个绘制调用的阶段。如以下各节所示,对这些阶段进行更详细的分析,以找出问题的原因。
Inspect Your Vertices in the Geometry Viewer
在几何查看器中检查顶点
顶点阶段显示一组与应用程序图元相对应的顶点,也称为网格(meshes)或几何(geometry)。若要以可视方式检查此数据是否存在任何问题,请双击“几何(Geometry)”。
Xcode在几何图形查看器中渲染顶点阶段输出的线框。在此之下,Xcode在表中列出相同的数据。单击线框中的一个顶点,然后Xcode在表中选择其对应的行。
通过以这种方式签出顶点信息,可以确保在视觉和数字上,顶点输出看起来正确。
If there were misplaced vertices on screen, it's possible the error lies in the data you provided to the vertex function. Bound Resources also lists your vertex stage inputs, so check there for any discrepancies by navigating back using the left-directional in the breadcrumb.
如果屏幕上的顶点放置不正确,则可能是您提供给顶点函数的数据存在错误。"Bound Resources "还会列出您的顶点阶段输入,因此请通过在面包屑中使用向左导航来检查那里的任何差异。
查看您对Xcode顶部列出的顶点函数的输入。
双击第一个顶点缓冲区,Xcode在表中显示缓冲区的内容。
每行标识一个顶点,包括其位置和颜色。 Xcode在顶点的数字颜色数据的右侧呈现颜色的预览。如果此表反映了您不期望的值,请在您的应用程序中调整代码或其他源,以向顶点函数提供数据以解决问题。
View Your Vertex Function in the Shader Debugger
在着色器调试器中查看您的顶点函数
如果应用程序的一个或多个顶点在不正确的位置或颜色上呈现,则问题可能是由应用程序的顶点着色器代码错误引起的。要检查这种可能性,请使用以下步骤在着色器调试器中打开顶点函数。选择一个顶点(下图中标注1标记),然后单击“调试”按钮(标注2标记)。
个人笔记:自己的Demo项目中Degug按钮为灰,不能点。
Xcode在其着色器调试器中显示顶点函数的源代码。
打开代码后,请确保它是您期望的着色器。否则,该问题表明您使用了错误的渲染管道,或者您配置了错误的渲染管道。因为您配置了包括着色器的渲染管道,所以您应该知道打算使用哪个着色器来处理所选的图元。
着色器调试器在每行代码旁边显示GPU执行该行时计算并存储的值。
单击计算值右侧的点。 Xcode向您显示多个标注的计算值。
这使您可以比较同一帧中所有顶点函数调用的结果。这样做可以揭示不一致之处,表明您的着色器代码或输入数据中存在错误。
View Your Fragment Function in the Shader Debugger
在着色器调试器中查看片段功能
您还可以查看片段功能如何处理特定片段。若要查看片段着色器中的每一行代码如何确定像素的输出颜色,请查看助手编辑器中显示的附件Xcode。
单击并按住鼠标,直到Xcode显示目标标线。移动鼠标选择一个像素。
单击‘Debug’按钮。
个人笔记:Xcode12没有Debug按钮,也可能是我哪一步失误了,导致没有出现按钮。
Xcode在着色器调试器中打开您的片段函数,其中的代码行带有对此像素的计算进行注释。
打开代码后,请确保它是您期望的着色器。否则,该问题表明您使用了错误的渲染管道,或者您配置了错误的渲染管道。因为您配置了包括着色器的渲染管线,所以您应该知道打算处理哪个着色器以选择像素。
单击计算值右侧的点,在下图中用标注1标记。 Xcode显示该像素为您的应用返回的颜色的可视化效果,在下图中用标注2标记。
如果“渲染”应用程序的片段着色器中有更多行,则可以类似的方式检查它们,以了解每行如何影响输出像素的颜色。
Metal提供了许多其他出色的工具,可用于调试和优化应用程序的性能和能耗。有关更多信息,请参见工具。