1.庫名: MetalKit
MetalKit 基于metal 封裝,極少代碼可以完成Metal需求;
2. MTKView
MTKView
:繼承UIView
用于展示圖形,有一個(gè)代理:
@property (nonatomic, weak, nullable) id <MTKViewDelegate> delegate;
Metal中,圖形渲染的工作交給MTKView代理來完成.
蘋果管官方建議:
渲染工作可以分裝在一個(gè)獨(dú)立的文件中完成,例如可以分裝一個(gè)獨(dú)立的工具類遵循協(xié)議:MTKViewDelegate
,把工具類作為MTKView的代理,在工具類中重寫MTKViewDelegate的協(xié)議方法和關(guān)聯(lián)Metal文件的操作.
3.命令緩沖區(qū):MTLCommandBuffer
Metal中,創(chuàng)建一個(gè)類型幾乎都是使用id
的形式
mtlView.device = MTLCreateSystemDefaultDevice();
//device => id <MTLDevice> device;
id<MTLCommandQueue> _commandQueue = [_device newCommandQueue];
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
//4.從視圖繪制中,獲得渲染描述符
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
//5.判斷renderPassDescriptor 渲染描述符是否創(chuàng)建成功,否則則跳過任何渲染.
if(renderPassDescriptor != nil)
{
//6.通過渲染描述符renderPassDescriptor創(chuàng)建MTLRenderCommandEncoder 對(duì)象
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
renderEncoder.label = @"MyRenderEncoder";
//7.我們可以使用MTLRenderCommandEncoder 來繪制對(duì)象,但是這個(gè)demo我們僅僅創(chuàng)建編碼器就可以了,我們并沒有讓Metal去執(zhí)行我們繪制的東西,這個(gè)時(shí)候表示我們的任務(wù)已經(jīng)完成.
//即可結(jié)束MTLRenderCommandEncoder 工作
[renderEncoder endEncoding];
/*
當(dāng)編碼器結(jié)束之后,命令緩存區(qū)就會(huì)接受到2個(gè)命令.
1) present
2) commit
因?yàn)镚PU是不會(huì)直接繪制到屏幕上,因此你不給出去指令.是不會(huì)有任何內(nèi)容渲染到屏幕上.
*/
//8.添加一個(gè)最后的命令來顯示清除的可繪制的屏幕
[commandBuffer presentDrawable:view.currentDrawable];
}
//9.在這里完成渲染并將命令緩沖區(qū)提交給GPU
[commandBuffer commit];
image.png
Metal中每一條渲染指令都是通過命令緩沖區(qū)來發(fā)送到GPU,