我正試圖在Metal中向一個紋理渲染3個獨立的東西。 我有一個MTLTexture,它被用作3個不同的MTLCommandBuffers的目標。我一個接一個地提交它們。每個MTLCommandBuffer渲染到紋理的一個單獨部分--第一個繪制0-1/3部分,第二個繪制中間的1/3-2/3,最后一個繪制2/3-1。
id<MTLTexture> dst_texture = ...。
id<MTLCommandBuffer> buffer1 = [self drawToTexture:dst_texture]。
[buffer1提交]。
id<MTLCommandBuffer> buffer2 = [self drawToTexture:dst_texture]。
[buffer2提交]。
id<MTLCommandBuffer> buffer3 = [self drawToTexture:dst_texture]。
[buffer3提交]。
問題是,我似乎不能在不同的命令緩沖區中共享目標紋理 - 我得到了故障,有時我只能看到目標紋理的部分結果。
在drawToTexture中,我這樣使用dst_texture:
_renderPassDescriptor.colorAttachments[0].texture = dst_texture;
_renderPassDescriptor.colorAttachments[0].loadAction=MTLLoadActionLoad。
當我在每次提交后呼叫[buffer waitUntilCompleted]時,問題得到了解決,但我想這影響了性能,我很想讓它沒有阻塞/等待。
這樣做可以:
id<MTLTexture> dst_texture = ...。
id<MTLCommandBuffer> buffer1 = [self drawToTexture:dst_texture]。
[buffer1 commit];
[buffer1 waitUntilCompleted]。
id<MTLCommandBuffer> buffer2 = [self drawToTexture:dst_texture]。
[buffer2 commit];
[buffer2 waitUntilCompleted]。
id<MTLCommandBuffer> buffer3 = [self drawToTexture:dst_texture]。
[buffer3 commit];
[buffer3 waitUntilCompleted]。
在這里我還可以做什么來避免waitUntilCompleted的呼叫?
uj5u.com熱心網友回復:
為了回答 "我試圖在金屬的一個紋理中渲染3個獨立的東西",以及 "我在這里還可以做什么來避免waitUntilCompleted的呼叫?"的問題。(Hamid已經解釋了問題發生的原因),就是你不應該在基本渲染中使用多個命令緩沖區來進行多次繪制呼叫。如果你要對一個紋理進行渲染,那么你需要一個命令緩沖區,用來創建一個renderPassDescriptor,將紋理附加到上面。然后你需要一個由renderPassDescriptor創建的編碼器,在那里你可以對所有的繪制呼叫和緩沖區狀態的改變等進行編碼。所以正如我在評論中所說的,你系結著色器設定緩沖區等,然后繪制,然后不呼叫endEncoding,而是反復設定著色器和緩沖區,以達到你想要的繪制呼叫和緩沖區改變的數量。 如果你想繪制多個紋理,那么你通常會創建多個renderPassDescriptors(但仍然使用一個命令緩沖區)。一般來說,你在每一幀中使用一個命令緩沖區,或者為一組螢屏外的渲染通道使用。
uj5u.com熱心網友回復:
手動同步只需要:
- 對于未跟蹤的資源。
- 跨多個設備。
- 在一個GPU和CPU之間.
- 在獨立的命令佇列之間.
否則,metal會自動在命令緩沖區之間同步資源(跟蹤),即使它們是并行運行的。
如果一個命令緩沖區包括對給定的MTLTexture的寫或讀操作,您必須確保這些操作在讀取或寫入MTLTexture內容之前完成。您可以使用addCompletedHandler:方法、waitUntilCompleted方法或自定義semaphores來提示命令緩沖區已完成執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/307329.html
標籤:
