創(chuàng)建指令隊列
在初始化的時候創(chuàng)建的一些 Metal 對象厘肮,如指令隊列和管道對象,通常會長久地保留它們局义。因為創(chuàng)建一次消耗較大,但是一旦初始化冗疮,可以快速重復(fù)使用萄唇。
創(chuàng)建一個指令隊列
為了創(chuàng)建指令隊列,調(diào)用設(shè)備的makeCommandQueue
函數(shù):
commandQueue = device.makeCommandQueue()
因為您通常會重用命令隊列术幔,所以請對其進行強引用另萤。您可以使用命令隊列來保存命令緩沖區(qū),如下所示:
創(chuàng)建一個或多個管道對象
管道對象告訴 Metal 如何處理命令诅挑。管道對象封裝了您使用 Metal 著色語言編寫的函數(shù)四敞。以下是管道如何適合您的Metal工作流程:
- 編寫處理數(shù)據(jù)的 Metal 著色器函數(shù)
- 創(chuàng)建包含著色器的管道對象
- 當(dāng)您準備好使用它時,啟用管道
- 進行繪制拔妥,計算或 blit 調(diào)用
Metal 不會立即執(zhí)行繪制忿危,計算或 blit 調(diào)用;相反没龙,使用編碼器對象將對象存儲在指令緩存區(qū)铺厨。提交命令緩沖區(qū)后缎玫,Metal 將其發(fā)送到 GPU 并使用活動管道對象處理其命令。
設(shè)置指令隊列和管道后努释,就可以向GPU發(fā)出命令了碘梢。以下是您遵循的流程:
- 創(chuàng)建一個指令緩存區(qū)
- 使用命令填充緩存區(qū)
- 提交指令緩存區(qū)到 GPU
創(chuàng)建指令緩存區(qū)
在指令隊列上咬摇,使用 makeCommandBuffer()
創(chuàng)建指令緩存區(qū)
guard let commandBuffer = commandQueue.makeCommandBuffer() else {
return
}
對于單線程應(yīng)用程序伐蒂,您可以創(chuàng)建單個命令緩沖區(qū)。下圖展示了命令與命令緩沖區(qū)之間的關(guān)系:
要使命令能夠運行肛鹏,請將命令緩沖區(qū)提交給GPU
commandBuffer.commit()
提交命令緩沖區(qū)不會立即運行其命令逸邦。相反,Metal 會調(diào)度緩沖區(qū)的命令在扰,使其僅在您提交在隊列中等待的先前命令緩沖區(qū)之后才能運行缕减。如果您沒有明確地將命令緩沖區(qū)排入隊列,則在您提交緩沖區(qū)后芒珠,Metal會為您執(zhí)行此操作桥狡。
提交后不再重用緩沖區(qū),但可以選擇通知其調(diào)度皱卓,完成或查詢其狀態(tài)裹芝。
指令編碼
指令編碼器將指令(如繪制,計算)編碼并放到指令緩存區(qū)娜汁。
可以使MTLCommandEncoder
的具體子類對實際命令進行編碼嫂易,具體取決于你的任務(wù):
- 使用
MTLRenderCommandEncoder
發(fā)出渲染命令 - 使用
MTLComputeCommandEncoder
發(fā)出并行計算命令 - 使用
MTLBlitCommandEncoder
發(fā)出資源管理命令