[MetalKit]1-Introducing介紹Metal

蘋果API搬運工發表於2017-12-14

本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.

MetalKit系統文章目錄


Metal 框架是在WWDC 2014 釋出了iOS版,在WWDC2015又釋出了OS X和tvOS版. Metal是一個為計算機GPU程式設計的介面.主要優點有:

  • 提供最底層的GPU訪問接入,因此它將減少其他框架中由於在CPUGPU之間傳遞資料而經常引起的效能瓶頸.
  • 提供相比OpenGL高達10倍的繪製呼叫.然而,Metal並不能像OpenGL一樣跨平臺,所以它並不能替代OpenGL.
  • 允許執行compute程式且效能等級相當於類似技術,如CUDAOpenCL.
  • 擁有可定製的著色語言,允許著色器預編譯,這樣執行時可以更快.
  • 擁有內建的記憶體和資源管理,相比其他平臺.

因為Metal不能用Xcode模擬器執行,我們無法保證所有讀者都擁有A7或更新處理器的iOS裝置,所以我們將建立一個OS X專案來代替.在Xcode中建立Cocoa Application.在故事板中,拖放一個LabelView Controller中.居中,拉大,確保能顯示2行文字.新增必要約束.你的故事板看起來應該像這樣:

chapter01_1.png

下一步,到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已經匯入了MetalAppKit框架以便我們使用NSViewController這樣的類,所以我們不需要另外再匯入Metal.

接著,在viewDidLoad() 中神奇的事情發生了.我們通過呼叫MTLCopyAllDevices()建立了一個Metal裝置,然後我們簡單查詢它的名字並展示到label上.注意,MTLCopyAllDevices()只適用於OS X.對iOS/tvOS裝置應使用MTLCreateSystemDefaultDevice().一個device是對GPU的抽象,提供了一些方法和屬性,比如我們上面用到的name等.

執行專案,你將能看到下面的輸出:

chapter01_2.png
很簡單的東西,但是現在你已經學會了如何在儘可能底層的水平上同GPU"交談".我要感謝 @warrenm ,沒有他的引導和激勵這些教程將會是不存在的.在他的書Metal by Example中, 你可以找到大師高的質量的OC版Metal專案.本文程式碼source code已上傳至Github .

下次見!

相關文章