本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.算法
上週在WWDC 2019上宣佈了Metal 3,Apple公佈了相關數字:swift
注意:要得到 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
大多數框架如今都是 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)
}
複製代碼
新的Metal Feature Set Tables文檔也更新到第 3 版,它在新的 GPU 家族系列中替代了舊功能集,以下所示:性能
要肯定 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 更新 |
去年推出了用於光線追蹤的 Metal 性能着色器(MPS)API 時,光線三角形交叉點的計算被轉移到 GPU 上,使得 Metal 中的光線追蹤真正開始吸引人。今年,另外兩個昂貴且重要的階段也轉移到 GPU 上:加速結構(acceleration structure)和圖像降噪(image denoising)。
加速結構(acceleration structure) 經過稱爲refitting的過程進行更新,該過程不會從頭開始重建加速結構,而是將邊界框移動到幾何體移動的位置,從而節省寶貴的處理時間。如今所有在GPU上完成:
新的 MPSSVGF 類實現了Spatiotemporal Variance-Guided Filtering降噪算法。如今,GPU 上的降噪速度比CPU上的速度高出 1000 倍。
Metal 去年推出了間接計算緩衝(ICB),這是一種經過重用命令來下降 CPU 開銷和簡化命令執行的方法。但它只適用於渲染。今年MTLIndirectComputeCommand
加入到MTLIndirectRenderCommand
中,一塊兒成爲 ICB 上的編碼類型。
GPU幀捕獲工具如今有一個 Metal Memory Viewer,可讓你檢查紋理,緩衝區和堆。該工具提供有關存儲模式,類型和大小的詳細信息:
至於分析,Instruments 工具如今具備 Metal Resource Allocations 工具,它容許您檢查存儲位置,並在每一個設備,顯示器或着色器編譯器上提供有關資源利用率和狀態的信息:
iOS 和 tvOS 新特性:
macOS 新特性:
其餘新特性:
[[primitive_id]]
和[[barycentric_coord]]
有關新功能的完整列表,請參閱Metal API文檔網站。新的源代碼也能夠在Apple網站上找到。
下次見。