Metal 框架之使用 Metal Debugger 查看 GPU 工作负载
概述
为了了解计算机是如何运行 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 工作负载相关推荐
- 基于 Metal 框架的 GPU 计算
概述 GPU 的优势在于并发计算能力,在本示例中,你将学习如何使用 Apple 的新框架 Metal 来实现并发计算. 你将学会如何将用C编写的简单函数转换为 Metal Shading Langua ...
- Metal 框架之渲染管线渲染图元
概述 在 < Metal 框架之使用 Metal 来绘制视图内容 >中,介绍了如何设置 MTKView 对象并使用渲染通道更改视图的内容,实现了将背景色渲染为视图的内容.本示例将介绍如何配 ...
- Metal 框架之自定义设置渲染通道
概述 渲染通道是一系列渲染命令,用于绘制一组纹理.本示例执行一对渲染通道来渲染视图的内容.对于第一个通道,示例创建了一个自定义渲染,将图像渲染成纹理.这个通道是一个离屏渲染通道,因为样本渲染为普通纹理 ...
- Metal 框架之从可绘制纹理中读取像素数据
概述 Metal 优化了纹理以供 GPU 快速访问,但不允许直接从 CPU 访问纹理的内容.当 App 需要更改或读取纹理的内容时,需要 Metal 在纹理和可访问的 CPU 内存(系统内存或使用共享 ...
- Metal 框架之创建纹理及纹理采样
概述 Metal 中使用纹理来绘制和处理图像,它是由像素组成的.使用2维数组的纹理来保存图像,每个元素都包含颜色数据.通过纹理映射技术将纹理绘制到几何图元上. 在片段着色器中,使用片段函数对纹理采样来 ...
- pytorch中查看gpu信息
其他:windows使用nvidia-smi查看gpu信息 为什么将数据转移至GPU的方法叫做.cuda而不是.gpu,就像将数据转移至CPU调用的方法是.cpu?这是因为GPU的编程接口采用CUDA ...
- linux下查看GPU版本和详情信息 CUDA版本信息 anaconda版本信息
查看GPU型号 lspci | grep -i nvidia 查看NVIDIA驱动版本 sudo dpkg --list | grep nvidia-* # lspci | grep -i nvidi ...
- pynvml 查看GPU已使用的显存
Python查看GPU已使用的显存 版权声明:随意转载,不用告诉我,但链接到就行. https://blog.csdn.net/u011094454/article/details/80774495 ...
- 【pytorch】torch 查看GPU
import torch 查看cuda是否可用 print(torch.cuda.is_available()) 查看cuda设备的数量 print(torch.cuda.device_count() ...
最新文章
- 【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类
- OpenStack-MitakaCentos7.2双节点搭建--(四)Nova服务
- java 按键框架,如何在java中更改框架?
- saltstack-gdlwolf自学总结第二篇:salt常用帮助查找命令
- 《挖掘管理价值:企业软件项目管理实战》一2.4 软件设计过程
- 重学java基础第十四课:java特性和优势
- scala 资源 copy 自知乎
- Life is not fair, get used to it.
- FPGA实现360°SG90舵机
- 手机里实现图片文字识别的实用方法
- Angular内置指令
- 数据库第三次实验报告
- aspcms 可以改成MySQL_ASPCMS免改数据库 快速修改后台登陆密码-♚付涛纪实阁♚
- 两种领导力:温柔与严厉
- 京东实习测开HR面(过)
- bdg2bw(macs2的peak要修正坐标)
- Ballerina 1.0版增加了Java互操作性并以JVM为目标
- axios下载流文件报错文件已损坏
- 快递扫地机器人被损坏_熬夜秒到的扫地机器人丢了 快递公司最多赔几十元
- 什么扫地机器人好用,哪一款扫地机器人好?
热门文章
- ubuntu操音量调整命令amixer
- ISTIO文档解读学习(三)
- 手眼标定算法---Navy算法(Robot sensor calibration: solving AX=XB on the Euclidean group)
- 【WIN32APIDAPI】RegisterClass CreateWindowEx UpdateWindow
- 汽车自适应巡航控制策略【CarSim/Simulink 仿真】
- Codeforces 32A A. Reconnaissance (暴力)
- (41.1)【JWT-KID漏洞】KID之目录遍历、命令注入、SQL注入
- (CVE-2014-0160)OpenSSL 心脏出血漏洞
- React中自定义高阶组件的应用(HOC)
- 大数据时代下的个人隐私