Metal入門資料007-MetalKit與Metal區(qū)別

寫在前面:

對(duì)Metal技術(shù)感興趣的同學(xué)众雷,可以關(guān)注我的專題:Metal專輯
也可以關(guān)注我個(gè)人的簡書賬號(hào):張芳濤
所有的代碼存儲(chǔ)的Github地址是:Metal

正文

我們來看看使用較新的MetalKit框架與使用較早的Metal框架之間有什么區(qū)別氮唯。 雖然它們?nèi)匀还泊娲趼ǎ荕etalKit引入了一些強(qiáng)大的功能揖膜,例如:

  • 容易的texture紋理加載(甚至用幾行代碼進(jìn)行異步加載)。
  • Model I/O網(wǎng)格和Metal緩沖區(qū)之間高效的數(shù)據(jù)傳輸窖剑。
  • MTKView - 一個(gè)方便的Metal-aware視圖(后面會(huì)有更詳細(xì)的介紹)聪轿。

我將首先提醒你我們?cè)诘谝徽轮锌吹降某绦蚴鞘裁礃拥模?/p>

import MetalKit

class MetalView: MTKView {

override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)
    render()
}

func render() {
    device = MTLCreateSystemDefaultDevice()
    if let rpd = currentRenderPassDescriptor, drawable = currentDrawable {
        rpd.colorAttachments[0].clearColor = MTLClearColorMake(0, 0.5, 0.5, 1.0)
        let command_buffer = device!.newCommandQueue().commandBuffer()
        let command_encoder = command_buffer.renderCommandEncoderWithDescriptor(rpd)
        command_encoder.endEncoding()
        command_buffer.presentDrawable(drawable)
        command_buffer.commit()
    }
  }
}

就是這樣! 簡單和優(yōu)雅的方式來清除你的背景顏色到你選擇的自定義顏色涡扼。 現(xiàn)在讓我們切換到使用沒有MTKViewMetal框架稼跳,所以我們需要改為NSView(或iOS中的UIView)的子類。

import Cocoa

class MetalView: NSView {

您會(huì)立即注意到一些錯(cuò)誤信號(hào)吃沪,表明以下屬性默認(rèn)不會(huì)再提供給我們:

  • a device
  • a drawable
  • a render pass descriptor

我們來解決這個(gè)問題汤善。 首先,由于NSView不是Metal-aware,我們需要?jiǎng)?chuàng)建一個(gè)CAMetalLayer并告訴NSView使用它作為其背景層红淡。 CAMetalLayer是一個(gè)核心動(dòng)畫層不狮,管理用于渲染其內(nèi)容的紋理池。 要使用Metal進(jìn)行渲染在旱,我們需要通過從視圖的layerClass()類方法中返回它摇零,將此類用作視圖的背景層。

override class func layerClass() -> AnyClass {
return CAMetalLayer.self
}

var metalLayer: CAMetalLayer {
return self.layer as! CAMetalLayer
}

接下來桶蝎,在render()函數(shù)中創(chuàng)建一個(gè)新設(shè)備并告訴metalLayer它擁有它驻仅,并且設(shè)置圖層將使用的像素格式。 然后登渣,創(chuàng)建一個(gè)drawable噪服。 請(qǐng)注意,我們沒有使用隨MTKView一起提供的currentDrawable胜茧。 而是粘优,CAMetalLayer提供了一個(gè)nextDrawable供我們使用。 最后呻顽,創(chuàng)建一個(gè)渲染通道描述符雹顺。 再次注意,我們沒有提供currentRenderPassDescriptor:

let device = MTLCreateSystemDefaultDevice()!
metalLayer.device = device
metalLayer.pixelFormat = .BGRA8Unorm
let drawable = metalLayer.nextDrawable()
let texture = drawable!.texture
let rpd = MTLRenderPassDescriptor() 

在本節(jié)結(jié)束之前廊遍,讓我們看一下MTKView類嬉愧,以再次看到為什么這是使用Metal在我們的應(yīng)用中呈現(xiàn)內(nèi)容的首選方式:

@available(OSX 10.11, *)
public class MTKView : NSView, NSCoding {
public init(frame frameRect: CGRect, device: MTLDevice?)
public init(coder: NSCoder)
weak public var delegate: MTKViewDelegate?
public var device: MTLDevice?
public var currentDrawable: CAMetalDrawable? { get }
public var framebufferOnly: Bool
public var presentsWithTransaction: Bool
public var colorPixelFormat: MTLPixelFormat
public var depthStencilPixelFormat: MTLPixelFormat
public var sampleCount: Int
public var clearColor: MTLClearColor
public var clearDepth: Double
public var clearStencil: UInt32
public var depthStencilTexture: MTLTexture? { get }
public var multisampleColorTexture: MTLTexture? { get }
public func releaseDrawables()
public var currentRenderPassDescriptor: MTLRenderPassDescriptor? { get }
public var preferredFramesPerSecond: Int
public var enableSetNeedsDisplay: Bool
public var autoResizeDrawable: Bool
public var drawableSize: CGSize
public var paused: Bool
public func draw()
}

@available(OSX 10.11, *)
public protocol MTKViewDelegate : NSObjectProtocol {
public func mtkView(view: MTKView, 
drawableSizeWillChange size: CGSize)
public func drawInMTKView(view: MTKView)
}

在眾多屬性中,請(qǐng)注意我們特別感興趣的屬性:device昧碉,currentDrawablecurrentRenderPassDescriptor英染。 另外值得一提的是,該類為其MTKViewDelegate屬性提供了一個(gè)協(xié)議被饿。 要詳細(xì)了解這些屬性和功能四康,請(qǐng)參閱MTKView參考文檔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狭握,一起剝皮案震驚了整個(gè)濱河市闪金,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌论颅,老刑警劉巖哎垦,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恃疯,居然都是意外死亡漏设,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門今妄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郑口,“玉大人鸳碧,你說我怎么就攤上這事∪裕” “怎么了瞻离?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乒裆。 經(jīng)常有香客問我套利,道長,這世上最難降的妖魔是什么鹤耍? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任肉迫,我火速辦了婚禮,結(jié)果婚禮上稿黄,老公的妹妹穿的比我還像新娘昂拂。我一直安慰自己,他們只是感情好抛猖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鼻听,像睡著了一般财著。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撑碴,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天撑教,我揣著相機(jī)與錄音,去河邊找鬼醉拓。 笑死伟姐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亿卤。 我是一名探鬼主播愤兵,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼排吴!你這毒婦竟也來了秆乳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤钻哩,失蹤者是張志新(化名)和其女友劉穎屹堰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體街氢,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扯键,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了珊肃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荣刑。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馅笙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘶摊,到底是詐尸還是另有隱情延蟹,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布叶堆,位于F島的核電站阱飘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虱颗。R本人自食惡果不足惜沥匈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忘渔。 院中可真熱鬧高帖,春花似錦、人聲如沸畦粮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宣赔。三九已至预麸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儒将,已是汗流浹背吏祸。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钩蚊,地道東北人贡翘。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像砰逻,于是被迫代替她去往敵國和親鸣驱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 寫在前面: 對(duì)Metal技術(shù)感興趣的同學(xué)诱渤,可以關(guān)注我的專題:Metal專輯也可以關(guān)注我個(gè)人的簡書賬號(hào):張芳濤所有的...
    張芳濤閱讀 4,570評(píng)論 0 6
  • 1丐巫、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,988評(píng)論 3 119
  • 本系列文章是對(duì) http://metalkit.org 上面MetalKit內(nèi)容的全面翻譯和學(xué)習(xí). MetalKi...
    蘋果API搬運(yùn)工閱讀 716評(píng)論 0 1
  • 1. 雨天的秘密 2016年,南方的梅雨季節(jié)來的似乎有些匆忙勺美,空氣中增添了一些潮濕的感覺递胧。天空晦暗得讓人壓抑,不見...
    玉非彧閱讀 642評(píng)論 0 7
  • 首先我們創(chuàng)建一個(gè)類:(以下是類的代碼) 這樣我們的調(diào)用類就完成了赡茸,接下來是如何調(diào)用這個(gè)類 這樣我們就可以推送了缎脾,我...
    浪子與渣男閱讀 5,155評(píng)論 17 15