概述

为了了解计算机是如何运行 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 配置,到如何单步调试都做了详细的讲解,并在关键环节配上了图文描述,方便帮助你快速入门。

本文示例代码下载


​​​​​​​

Metal 框架之使用 Metal Debugger 查看 GPU 工作负载相关推荐

  1. 基于 Metal 框架的 GPU 计算

    概述 GPU 的优势在于并发计算能力,在本示例中,你将学习如何使用 Apple 的新框架 Metal 来实现并发计算. 你将学会如何将用C编写的简单函数转换为 Metal Shading Langua ...

  2. Metal 框架之渲染管线渲染图元

    概述 在 < Metal 框架之使用 Metal 来绘制视图内容 >中,介绍了如何设置 MTKView 对象并使用渲染通道更改视图的内容,实现了将背景色渲染为视图的内容.本示例将介绍如何配 ...

  3. Metal 框架之自定义设置渲染通道

    概述 渲染通道是一系列渲染命令,用于绘制一组纹理.本示例执行一对渲染通道来渲染视图的内容.对于第一个通道,示例创建了一个自定义渲染,将图像渲染成纹理.这个通道是一个离屏渲染通道,因为样本渲染为普通纹理 ...

  4. Metal 框架之从可绘制纹理中读取像素数据

    概述 Metal 优化了纹理以供 GPU 快速访问,但不允许直接从 CPU 访问纹理的内容.当 App 需要更改或读取纹理的内容时,需要 Metal 在纹理和可访问的 CPU 内存(系统内存或使用共享 ...

  5. Metal 框架之创建纹理及纹理采样

    概述 Metal 中使用纹理来绘制和处理图像,它是由像素组成的.使用2维数组的纹理来保存图像,每个元素都包含颜色数据.通过纹理映射技术将纹理绘制到几何图元上. 在片段着色器中,使用片段函数对纹理采样来 ...

  6. pytorch中查看gpu信息

    其他:windows使用nvidia-smi查看gpu信息 为什么将数据转移至GPU的方法叫做.cuda而不是.gpu,就像将数据转移至CPU调用的方法是.cpu?这是因为GPU的编程接口采用CUDA ...

  7. linux下查看GPU版本和详情信息 CUDA版本信息 anaconda版本信息

    查看GPU型号 lspci | grep -i nvidia 查看NVIDIA驱动版本 sudo dpkg --list | grep nvidia-* # lspci | grep -i nvidi ...

  8. pynvml 查看GPU已使用的显存

    Python查看GPU已使用的显存 版权声明:随意转载,不用告诉我,但链接到就行. https://blog.csdn.net/u011094454/article/details/80774495 ...

  9. 【pytorch】torch 查看GPU

    import torch 查看cuda是否可用 print(torch.cuda.is_available()) 查看cuda设备的数量 print(torch.cuda.device_count() ...

最新文章

  1. 【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类
  2. OpenStack-MitakaCentos7.2双节点搭建--(四)Nova服务
  3. java 按键框架,如何在java中更改框架?
  4. saltstack-gdlwolf自学总结第二篇:salt常用帮助查找命令
  5. 《挖掘管理价值:企业软件项目管理实战》一2.4 软件设计过程
  6. 重学java基础第十四课:java特性和优势
  7. scala 资源 copy 自知乎
  8. Life is not fair, get used to it.
  9. FPGA实现360°SG90舵机
  10. 手机里实现图片文字识别的实用方法
  11. Angular内置指令
  12. 数据库第三次实验报告
  13. aspcms 可以改成MySQL_ASPCMS免改数据库 快速修改后台登陆密码-♚付涛纪实阁♚
  14. 两种领导力:温柔与严厉
  15. 京东实习测开HR面(过)
  16. bdg2bw(macs2的peak要修正坐标)
  17. Ballerina 1.0版增加了Java互操作性并以JVM为目标
  18. axios下载流文件报错文件已损坏
  19. 快递扫地机器人被损坏_熬夜秒到的扫地机器人丢了 快递公司最多赔几十元
  20. 什么扫地机器人好用,哪一款扫地机器人好?

热门文章

  1. ubuntu操音量调整命令amixer
  2. ISTIO文档解读学习(三)
  3. 手眼标定算法---Navy算法(Robot sensor calibration: solving AX=XB on the Euclidean group)
  4. 【WIN32APIDAPI】RegisterClass CreateWindowEx UpdateWindow
  5. 汽车自适应巡航控制策略【CarSim/Simulink 仿真】
  6. Codeforces 32A A. Reconnaissance (暴力)
  7. (41.1)【JWT-KID漏洞】KID之目录遍历、命令注入、SQL注入
  8. (CVE-2014-0160)OpenSSL 心脏出血漏洞
  9. React中自定义高阶组件的应用(HOC)
  10. 大数据时代下的个人隐私