[MetalKit]47-Introducing Metal 3 Metal 3簡介

本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.算法

MetalKit系統文章目錄編程


上週在WWDC 2019上宣佈了Metal 3,Apple公佈了相關數字:swift

  • Metal如今能夠比OpenGL多100倍的繪製調用。
  • Metal目前在大約14億臺設備上運行。
  • Metal能夠驅動高達56 TFLOPS的單精度運算。

注意:要得到 56 TFLOPS,您須要具備雙 Vega II Duo(4 GPU)的新 Mac Pro。 Radeon Pro Vega II Duo 是目前世界上功能最強大的 GPU,可以提供 28.3 TFLOP 的 FP32 精度。此 GPU 僅適用於 Mac Pro,它使用 Infinity Fabric Link 將雙 GPU 之間的內部傳輸提高至 48 GB /秒。app

Metal Shading Language 如今版本是 2.2,而 API 版本是 3。如今能夠經過查看 MTLSoftwareVersion 枚舉來檢查 Xcode 11 中的 Metal 版本,這是一個設備屬性:框架

好吧,讓咱們看看今年 Metal 框架的一些重要補充。ide

1. iOS模擬器如今支持 Metal

大多數框架如今都是 Metal 加速的:UIKit,SpriteKit,SceneKit,Core Animation,Core Image,MapKit等。該模擬器適用於A8 GPU 及更高版本。您甚至能夠在兩個不一樣的 target 上同時運行兩個模擬器:svg

iOS Metal 指令被轉換爲 macOS Metal 指令,所以您能夠從 Mac 底層 GPU 硬件中受益。從模擬器菜單中,您能夠選擇要使用的 macOS GPU: 工具

模擬器中的 Metal 性能仍然低於真實設備的性能,所以應該最終在設備上對生產代碼進行分析和優化。使用模擬器時要記住的另外一件事是模擬器上的紋理存儲須要始終處於私有模式。可是,很容易涵蓋這兩種狀況。當紋理在模擬器上時,建立一個臨時共享緩衝區,將紋理初始化到該緩衝區,而後將其 blit 到私有紋理:post

#if targetEnvironment(simulator) 
textureDescriptor.storageMode = .private 
#else 
textureDescriptor.storageMode = .shared 
#endif 

let texture = device.makeTexture(descriptor: textureDescriptor)! 
if texture.storageMode == .private { 
    let tmpBuffer = device.makeBuffer(length: textureSize, 
				      options: .storageModeShared)! 
    initWithTextureData(buffer: tmpBuffer) 
    blitData(fromBuffer: tmpBuffer, toTexture: texture) 
} else { 
    initWithTextureData(texture: texture) 
} 
複製代碼

2. 簡化 GPU 家族系列

新的Metal Feature Set Tables文檔也更新到第 3 版,它在新的 GPU 家族系列中替代了舊功能集,以下所示:性能

  • Apple 家族系列是指全部 Apple 設計的GPU(A系列GPU)。
  • Mac家族系列是指全部 macOS GPU(Intel,AMD,Nvidia):
  • Common 家族系列是指全部設備和平臺:
  • 適用於 Mac 系列的 iPad 應用程序是指在 macOS 上運行的 iPadOS 應用:

要肯定 Mac 2 系列功能是否可用:

if #available(macOS 10.15, iOS 13, tvOS 13, *) { 
    if self.device.supportsVersion(.version3_0) { 
        if self.device.supportsFamily(.familyMac2) { 
            // enable Metal 3 features for the Mac family 2 
        }
    }
    else { 
        // enable Metal 2 features (fallback)
    }
} else { 
    if self.device.supportsFeatureSet(.featureSet_macOS_GPUFamily2_v1) { 
        // enable Metal 2 features (fallback)
    }
}
複製代碼

如下是一些最多見的技術及其家族系列的支持性:

特性 家族系列
Deferred shading(延遲着色) 所有系列
Programmable blending(可編程混合) Apple 1 及更新
Tile deferred / forward(分塊延遲/前向) Common 2 及更新
Tile shading (分塊着色) Apple 3 及更新
Visibility buffer (可見性緩衝) Mac 1 及更新
Argument buffers(參數緩衝) 所有系列
Indirect Command buffers(間接命令緩衝) Common 2 更新

3. 光線跟蹤和計算

去年推出了用於光線追蹤的 Metal 性能着色器(MPS)API 時,光線三角形交叉點的計算被轉移到 GPU 上,使得 Metal 中的光線追蹤真正開始吸引人。今年,另外兩個昂貴且重要的階段也轉移到 GPU 上:加速結構(acceleration structure)和圖像降噪(image denoising)。

加速結構(acceleration structure) 經過稱爲refitting的過程進行更新,該過程不會從頭開始重建加速結構,而是將邊界框移動到幾何體移動的位置,從而節省寶貴的處理時間。如今所有在GPU上完成:

圖像降噪(image denoising) 則巧妙地利用了基於圖像處理的降噪濾波器。其背後的思想是,每幀存儲法線和深度信息,而後將它們與下一幀進行比較,以查看某些像素是否無效。若是物體移動到不一樣的位置或另外一個物體將其遮擋,則可能會發生這種無效的狀況。

新的 MPSSVGF 類實現了Spatiotemporal Variance-Guided Filtering降噪算法。如今,GPU 上的降噪速度比CPU上的速度高出 1000 倍。

Metal 去年推出了間接計算緩衝(ICB),這是一種經過重用命令來下降 CPU 開銷和簡化命令執行的方法。但它只適用於渲染。今年MTLIndirectComputeCommand加入到MTLIndirectRenderCommand中,一塊兒成爲 ICB 上的編碼類型。

4. 調試和分析工具

GPU幀捕獲工具如今有一個 Metal Memory Viewer,可讓你檢查紋理,緩衝區和堆。該工具提供有關存儲模式,類型和大小的詳細信息:

至於分析,Instruments 工具如今具備 Metal Resource Allocations 工具,它容許您檢查存儲位置,並在每一個設備,顯示器或着色器編譯器上提供有關資源利用率和狀態的信息:

5. 其餘 Metal 3 的新特性

iOS 和 tvOS 新特性:

  • 在間接命令緩衝(Indirect Command Buffers)上設置管道狀態
  • 從緩衝中獲取間接命令緩衝(Indirect Command Buffers)範圍
  • 16位深度紋理

macOS 新特性:

  • 無渲染通道附件條件下渲染(Rendering without render pass attachments)
  • 命令緩衝時序(Command buffer timing)
  • 在 sRGB 和非 sRGB 紋理視圖之間進行轉換

其餘新特性:

  • 堆支持開發人員驅動的放置(Heaps support developer driven placement)
  • 堆能夠跟蹤資源
  • 放鬆 macOS blit 對齊規則以匹配 Apple GPU
  • 改善資源使用
  • 紋理訪問的預約義行爲(Well-defined behavior for texture access)
  • 紋理自定義swizzle
  • 跨進程的紋理共享
  • iOS紋理綁定數量增長
  • iOS變化限制增長
  • ASTC 3D支持最新的Apple GPU
  • 3D BC 紋理支持全部 Mac GPU
  • 可見性緩衝(又稱遮擋查詢(occlusion query))大小增長到 256K
  • MSL新屬性[[primitive_id]][[barycentric_coord]]

有關新功能的完整列表,請參閱Metal API文檔網站。新的源代碼也能夠在Apple網站上找到。

下次見。

相關文章
相關標籤/搜索