iOS开发实践Flutter学习暂存

Metal框架详细解析(十八) —— 工具、分析和调试之Meta

2018-10-08  本文已影响578人  刀客传奇

版本记录

版本号 时间
V1.0 2018.10.08 星期一

前言

很多做视频和图像的,相信对这个框架都不是很陌生,它渲染高级3D图形,并使用GPU执行数据并行计算。接下来的几篇我们就详细的解析这个框架。感兴趣的看下面几篇文章。
1. Metal框架详细解析(一)—— 基本概览
2. Metal框架详细解析(二) —— 器件和命令(一)
3. Metal框架详细解析(三) —— 渲染简单的2D三角形(一)
4. Metal框架详细解析(四) —— 关于GPU Family 4(一)
5. Metal框架详细解析(五) —— 关于GPU Family 4之关于Imageblocks(二)
6. Metal框架详细解析(六) —— 关于GPU Family 4之关于Tile Shading(三)
7. Metal框架详细解析(七) —— 关于GPU Family 4之关于光栅顺序组(四)
8. Metal框架详细解析(八) —— 关于GPU Family 4之关于增强的MSAA和Imageblock采样覆盖控制(五)
9. Metal框架详细解析(九) —— 关于GPU Family 4之关于线程组共享(六)
10. Metal框架详细解析(十) —— 基本组件(一)
11. Metal框架详细解析(十一) —— 基本组件之器件选择 - 图形渲染的器件选择(二)
12. Metal框架详细解析(十二) —— 基本组件之器件选择 - 计算处理的设备选择(三)
13. Metal框架详细解析(十三) —— 计算处理(一)
14. Metal框架详细解析(十四) —— 计算处理之你好,计算(二)
15. Metal框架详细解析(十五) —— 计算处理之关于线程和线程组(三)
16. Metal框架详细解析(十六) —— 计算处理之计算线程组和网格大小(四)
17. Metal框架详细解析(十七) —— 工具、分析和调试(一)

Metal GPU Capture

使用Xcode工具或Metal API捕获应用程序的Metal命令和状态的运行时快照。

Topics

1. GPU Capture Settings
2. GPU Capture API
3. Xcode GPU Capture

Configuring the GPU Frame Capture and Metal API Validation Tools - 配置GPU帧捕获和Metal API验证工具

选择GPU Frame CaptureMetal API Validation工具的调试选项。

如果您的target链接到Metal框架(或任何其他使用Metal API的框架),Xcode会自动启用GPU Frame CaptureMetal API Validation工具。 始终保持启用这些工具以测试正确的Metal API使用情况;仅在您需要测试Metal应用程序的最高性能级别时才禁用它们。

1. Navigate to the Metal Scheme Settings - 导航到Metal Scheme Settings

2. Choose a GPU Frame Capture Option - 选择GPU Frame Capture Option

选择最适合您的调试需求的选项:

注意:禁用GPU Frame Capture工具也会禁用Metal API Validation工具。

3. Choose a Metal API Validation Option - 选择Metal API Validation选项

选择最适合您的验证和性能需求的选项:

注意:启用Metal API Validation工具仅影响CPU性能,而不影响GPU性能。


Assigning a Default Capture Scope - 设置默认的Default Capture Scope

为共享捕获管理器创建并定义默认捕获范围。

为应用程序的共享MTLCaptureManager分配默认捕获范围允许您从Xcode的调试栏执行GPU捕获,而无需选择特定的捕获范围。

1. Create a Default Capture Scope - 创建默认捕获范围

创建一个新的MTLCaptureScope并将其分配给应用程序的共享 defaultCaptureScope属性。

MTLCaptureManager *sharedCaptureManager = [MTLCaptureManager sharedCaptureManager];
id<MTLCaptureScope> myCaptureScope = [sharedCaptureManager newCaptureScopeWithDevice:_device];
myCaptureScope.label = @"My Capture Scope";
sharedCaptureManager.defaultCaptureScope = myCaptureScope;

2. Define the Default Capture Scope Boundaries - 定义默认捕获范围边界

通过在要捕获的代码之前和之后调用 beginScopeendScope方法,为默认捕获范围定义自定义边界。

MTLCaptureManager *sharedCaptureManager = [MTLCaptureManager sharedCaptureManager];
[sharedCaptureManager.defaultCaptureScope beginScope];
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
// Do Metal work
[commandBuffer commit];
[sharedCaptureManager.defaultCaptureScope endScope];

Performing a GPU Capture Programmatically - 以编程方式执行GPU捕获

使用Metal的GPU捕获API以编程方式执行GPU捕获。

使用MTLCaptureManagerMTLCaptureScope API以编程方式启动和停止特定设备,命令队列或捕获范围的GPU捕获。 这些API可用于捕获特定帧或进程,在满足某些代码条件时执行捕获,或实现触发捕获的自定义UI。

注意:只有当您的应用程序从Xcode启动并启用GPU帧捕获时,才能使用捕获功能。 当您的应用程序从任何其他环境启动时,仍会创建MTLCaptureManagerMTLCaptureScope对象但对您的应用程序没有任何影响。

1. Capture a Device or Command Queue - 捕获设备或命令队列

要开始捕获特定MTLDeviceMTLCommandQueue的命令,请调用startCaptureWithDevice:startCaptureWithCommandQueue:方法。 要停止捕获命令,请调用stopCapture方法。

- (void)triggerProgrammaticCapture
{
    [[MTLCaptureManager sharedCaptureManager] startCaptureWithDevice:_device];
}

- (void)runMetalCommands
{
    id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
    // Do Metal work
    [commandBuffer commit];
    [[MTLCaptureManager sharedCaptureManager] stopCapture];
}

捕获管理器仅捕获捕获开始后创建的MTLCommandBuffer对象中的命令,并在捕获停止之前提交。

2. Capture a Custom Scope - 捕获自定义范围

要定义MTLCaptureScope的边界,请在要捕获的命令之前和之后调用beginScopeendScope方法。 要开始捕获特定捕获范围的命令,请调用startCaptureWithScope:方法。 当您的应用程序到达给定捕获范围的相应endScope方法时,捕获将停止。

- (void)setupProgrammaticCaptureScope
{
    _myCaptureScope = [[MTLCaptureManager sharedCaptureManager] newCaptureScopeWithDevice:_device];
    _myCaptureScope.label = @"My Capture Scope";
}

- (void)triggerProgrammaticCaptureScope
{
    [[MTLCaptureManager sharedCaptureManager] startCaptureWithScope:_myCaptureScope];
}

- (void)runMetalCommands
{
    [_myCaptureScope beginScope];
    id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
    // Do Metal work
    [commandBuffer commit];
    [_myCaptureScope endScope];
}

捕获范围仅捕获在范围开始之后创建的MTLCommandBuffer对象中的命令,并在范围结束之前提交。


Performing a GPU Capture from the Debug Bar - 从调试栏执行GPU捕获

使用Xcode的调试栏为应用程序的当前状态执行GPU捕获。

您可以在应用程序的任何位置手动执行GPU捕获,这样您就可以在任何运行时条件下捕获应用程序GPU状态的快照。

1. Capture the Default Scope - 捕获默认范围

要从调试栏捕获默认范围:

注意:Xcode自动捕获分配给defaultCaptureScope属性的MTLCaptureScope。 如果此属性的值为nil,则默认捕获范围由可绘制的表示边界定义;例如,调用presentDrawable:present等方法。

2. Capture a Custom Scope - 捕获自定义范围

要从调试栏捕获自定义范围:


Performing a GPU Capture from a Breakpoint - 从断点执行GPU捕获

使用Xcode的断点操作在应用程序的断点处执行自动GPU捕获。

当您的应用程序到达代码中的特定行时,Xcode可以自动执行GPU捕获,这允许您在断点处捕获应用程序GPU状态的快照。

要为断点设置GPU捕获:

现在,当调试器到达断点时,Xcode会自动执行GPU捕获。

后记

本篇主要讲述了Metal GPU Capture,感兴趣的给个赞或者关注~~~

上一篇下一篇

猜你喜欢

热点阅读