2017-10-15 81 views
2

Metal Best Practices Guide,它指出,爲了獲得最佳性能應該「實現三重緩衝模型更新動態緩衝區的數據,」和「動態緩衝區中的數據是指經常更新存儲在緩衝區中的數據。」金屬最佳實踐:三重緩衝 - 紋理呢?

是否一個MTLTexture符合「存儲在緩衝區頻繁更新的數據」,如果它需要每一幀進行更新?以上指南中的所有示例都集中在MTLBuffer s。

我注意到蘋果在MetalKit實現有一個nextDrawable的概念,所以也許這就是這裏發生了什麼?

回答

3

如果某個命令可能正在運行,並且可以在修改CPU上的同一紋理時訪問(讀取/採樣/寫入)紋理(例如,使用-replaceRegion:...方法之一或通過寫入背景IOSurface ),那麼你需要一個多緩衝技術,是的。

如果您只修改GPU上的紋理(通過渲染,從着色器函數寫入或使用blit命令編碼器方法複製到它),則不需要多重緩衝。您可能需要在着色器功能中使用紋理柵欄,或者您可能需要在繪製調用之間的渲染命令編碼器上調用-textureBarrier,具體取決於您正在執行的操作。

是,nextDrawable提供多緩衝的形式。但在這種情況下,這不是由於CPU訪問所致。您將渲染到一個紋理,而之前渲染的紋理可能仍然在屏幕上。您不希望爲兩者使用相同的紋理,因爲新渲染可能會在將紋理放入屏幕之前重新繪製紋理,從而顯示損壞的結果。

+0

有趣的,謝謝。因此,在一個多通道的情況下渲染 - 即一個通過渲染背景到紋理,未來呈現疊加成另一種質感,而前兩個紋理複合在一起的最後一傳,是否會受到同樣的風險的腐敗沒有多緩衝前兩次通過的目標紋理,另外最後的傳球? – Tricky

+1

如果我理解你描述的場景,那麼,不,不需要多緩衝。對於一幀的兩個紋理的合成將在它們被下一幀覆蓋之前完成(除非*你*以錯誤的順序排列命令)。 –