美文网首页iOS开发实践Flutter学习暂存
Metal框架详细解析(十八) —— 工具、分析和调试之Meta

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

作者: 刀客传奇 | 来源:发表于2018-10-08 16:29 被阅读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

    • 1) 在工具栏中,从方案菜单中选择Edit Scheme。 (或者,选择Product > Scheme > Edit Scheme。)
    • 2) 在scheme操作面板中,选择Run
    • 3) 在action setting选项卡中,选择Options

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

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

    • Automatically Enabled - 自动启用。 捕获应用程序中的MetalOpenGL ES API的使用。 如果您的目标未链接到Metal或OpenGL ES框架,则调试栏中不会显示Capture GPU Frame图标。 如果您的应用程序同时使用Metal和OpenGL ES API,则可以单击并按住Capture GPU Frame图标以选择要捕获的API使用情况。

    • Metal。 仅捕获应用中的Metal API用法。 如果您的应用不使用Metal API,则会在调试栏中禁用Capture GPU Frame图标。

    • Disabled - 禁用。 不捕获应用中的Metal使用情况。

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

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

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

    • Enabled - 启用。 Metal为Metal API调用执行运行时验证和断言。

    • Extended - 扩展。 Metal执行与Enabled选项相同的运行时验证和断言。 此外,Metal在GPU捕获后运行并分析与资源相关的启发式算法(heuristics)

    • Disabled - 禁用。 Metal不会对Metal API调用执行运行时验证和断言。

    注意:启用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 - 捕获默认范围

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

    • 1) 在Xcode中,在物理设备上运行Metal应用程序。
    • 2) 在调试栏中,单击Capture GPU Frame按钮。 (或者,选择Debug > Capture GPU Frame。)

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

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

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

    • 1) 在您的Metal代码中,使用MTLCaptureManagerMTLCaptureScope实现自定义捕获范围。
    • 2) 在Xcode中,在物理设备上运行Metal应用程序。
    • 3) 在调试栏中,单击并按住Capture GPU Frame按钮。 (或者,选择Debug > Capture GPU Scope。)
    • 4) 从Capture Scope上下文菜单中,选择自定义捕获范围。 (或者,选择Debug > Capture GPU Scope > Capture Scope,然后选择自定义捕获范围。)

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

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

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

    要为断点设置GPU捕获:

    • 1) 在代码中添加断点。
    • 2) 按住Control键并单击断点,然后选择Edit Breakpoint以打开GPU Capture对话框。
    • 3) 单击“添加”按钮(+),然后从Action菜单中选择Capture GPU Frame

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

    后记

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/zxcjaftx.html