Metal框架詳細解析(十八) —— 工具、分析和調試之Metal GPU Capture(二)

版本記錄

版本號 時間
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框架詳細解析(十六) —— 計算處理之計算線程組和網格大?。ㄋ模?/a>
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,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容