本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.
Metal 框架是在WWDC 2014 釋出了iOS版,在WWDC2015又釋出了OS X和tvOS版. Metal是一個為計算機GPU程式設計的介面.主要優點有:
- 提供最底層的
GPU
訪問接入,因此它將減少其他框架中由於在CPU
和GPU
之間傳遞資料而經常引起的效能瓶頸. - 提供相比
OpenGL
高達10倍的繪製呼叫.然而,Metal
並不能像OpenGL
一樣跨平臺,所以它並不能替代OpenGL
. - 允許執行
compute
程式且效能等級相當於類似技術,如CUDA
和OpenCL
. - 擁有可定製的著色語言,允許著色器預編譯,這樣執行時可以更快.
- 擁有內建的記憶體和資源管理,相比其他平臺.
因為Metal
不能用Xcode
模擬器執行,我們無法保證所有讀者都擁有A7或更新處理器的iOS
裝置,所以我們將建立一個OS X
專案來代替.在Xcode
中建立Cocoa Application
.在故事板中,拖放一個Label
到View Controller
中.居中,拉大,確保能顯示2行文字.新增必要約束.你的故事板看起來應該像這樣:
下一步,到ViewController.swift中為剛才的label建立一個IBOutlet
.你可以全名為label
或其他你想要名字.最後,我們來寫些程式碼.你的類應該是這樣的:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var label: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
let devices = MTLCopyAllDevices()
guard let _ = devices.first else {
fatalError("Your GPU does not support Metal!")
}
label.stringValue = "Your system has the following GPU(s):\n"
for device in devices {
label.stringValue += "\(device.name!)\n"
}
}
}
複製程式碼
讓我們看一下上面的程式碼.首先我們需要import Metal
因為我們呼叫了Metal
框架中的MTLCopyAllDevices() 函式.然而,因為Cocoa
已經匯入了Metal
和AppKit
框架以便我們使用NSViewController
這樣的類,所以我們不需要另外再匯入Metal
.
接著,在viewDidLoad() 中神奇的事情發生了.我們通過呼叫MTLCopyAllDevices()
建立了一個Metal
裝置,然後我們簡單查詢它的名字並展示到label上.注意,MTLCopyAllDevices()
只適用於OS X
.對iOS/tvOS
裝置應使用MTLCreateSystemDefaultDevice()
.一個device
是對GPU
的抽象,提供了一些方法和屬性,比如我們上面用到的name
等.
執行專案,你將能看到下面的輸出:
很簡單的東西,但是現在你已經學會了如何在儘可能底層的水平上同GPU
"交談".我要感謝 @warrenm ,沒有他的引導和激勵這些教程將會是不存在的.在他的書Metal by Example中, 你可以找到大師高的質量的OC版Metal專案.本文程式碼source code已上傳至Github .
下次見!