本系列文章是對 http://metalkit.org 上面MetalKit內容的全面翻譯和學習.
目錄 http://www.lxweimin.com/p/64441ea99eba
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 .下次見!