本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.
上週在WWDC 2019上宣佈了Metal 3,Apple公佈了相關數字:
- 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 /秒。
Metal Shading Language 現在版本是 2.2,而 API 版本是 3。現在可以通過檢視 MTLSoftwareVersion 列舉來檢查 Xcode 11 中的 Metal 版本,這是一個裝置屬性:
好吧,讓我們看看今年 Metal 框架的一些重要補充。
1. iOS模擬器現在支援 Metal
大多數框架現在都是 Metal 加速的:UIKit,SpriteKit,SceneKit,Core Animation,Core Image,MapKit等。該模擬器適用於A8 GPU 及更高版本。您甚至可以在兩個不同的 target 上同時執行兩個模擬器:
iOS Metal 指令被轉換為 macOS Metal 指令,因此您可以從 Mac 底層 GPU 硬體中受益。從模擬器選單中,您可以選擇要使用的 macOS GPU:
模擬器中的 Metal 效能仍然低於真實裝置的效能,因此應該最終在裝置上對生產程式碼進行分析和優化。使用模擬器時要記住的另一件事是模擬器上的紋理儲存需要始終處於私有模式。但是,很容易涵蓋這兩種情況。當紋理在模擬器上時,建立一個臨時共享緩衝區,將紋理初始化到該緩衝區,然後將其 blit 到私有紋理:
#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網站上找到。
下次見。