本系列文章是對 http://metalkit.org 上面MetalKit內(nèi)容的全面翻譯和學(xué)習(xí).
目錄 http://www.reibang.com/p/64441ea99eba
Metal 框架是在WWDC 2014 發(fā)布了iOS版,在WWDC2015又發(fā)布了OS X和tvOS版. Metal是一個(gè)為計(jì)算機(jī)GPU編程的接口.主要優(yōu)點(diǎn)有:
- 提供最底層的
GPU
訪問接入,因此它將減少其他框架中由于在CPU
和GPU
之間傳遞數(shù)據(jù)而經(jīng)常引起的性能瓶頸. - 提供相比
OpenGL
高達(dá)10倍的繪制調(diào)用.然而,Metal
并不能像OpenGL
一樣跨平臺,所以它并不能替代OpenGL
. - 允許運(yùn)行
compute
程序且性能等級相當(dāng)于類似技術(shù),如CUDA
和OpenCL
. - 擁有可定制的著色語言,允許著色器預(yù)編譯,這樣運(yùn)行時(shí)可以更快.
- 擁有內(nèi)置的內(nèi)存和資源管理,相比其他平臺.
因?yàn)?code>Metal不能用Xcode
模擬器運(yùn)行,我們無法保證所有讀者都擁有A7或更新處理器的iOS
設(shè)備,所以我們將創(chuàng)建一個(gè)OS X
項(xiàng)目來代替.在Xcode
中創(chuàng)建Cocoa Application
.在故事板中,拖放一個(gè)Label
到View Controller
中.居中,拉大,確保能顯示2行文本.添加必要約束.你的故事板看起來應(yīng)該像這樣:
下一步,到ViewController.swift中為剛才的label創(chuàng)建一個(gè)IBOutlet
.你可以全名為label
或其他你想要名字.最后,我們來寫些代碼.你的類應(yīng)該是這樣的:
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
因?yàn)槲覀冋{(diào)用了Metal
框架中的MTLCopyAllDevices()函數(shù).然而,因?yàn)?code>Cocoa已經(jīng)導(dǎo)入了Metal
和AppKit
框架以便我們使用NSViewController
這樣的類,所以我們不需要另外再導(dǎo)入Metal
.
接著,在viewDidLoad()中神奇的事情發(fā)生了.我們通過調(diào)用MTLCopyAllDevices()
創(chuàng)建了一個(gè)Metal
設(shè)備,然后我們簡單查詢它的名字并展示到label上.注意,MTLCopyAllDevices()
只適用于OS X
.對iOS/tvOS
設(shè)備應(yīng)使用MTLCreateSystemDefaultDevice()
.一個(gè)device
是對GPU
的抽象,提供了一些方法和屬性,比如我們上面用到的name
等.
運(yùn)行項(xiàng)目,你將能看到下面的輸出:
很簡單的東西,但是現(xiàn)在你已經(jīng)學(xué)會了如何在盡可能底層的水平上同
GPU
"交談".我要感謝 @warrenm ,沒有他的引導(dǎo)和激勵這些教程將會是不存在的.在他的書Metal by Example中, 你可以找到大師高的質(zhì)量的OC版Metal項(xiàng)目.本文代碼source code已上傳至Github .下次見!