1.库名: MetalKit
MetalKit 基于metal 封装,极少代码可以完成Metal需求;
2. MTKView
MTKView
:继承UIView
用于展示图形,有一个代理:
@property (nonatomic, weak, nullable) id <MTKViewDelegate> delegate;
Metal中,图形渲染的工作交给MTKView代理来完成.
苹果管官方建议:
渲染工作可以分装在一个独立的文件中完成,例如可以分装一个独立的工具类遵循协议:MTKViewDelegate
,把工具类作为MTKView的代理,在工具类中重写MTKViewDelegate的协议方法和关联Metal文件的操作.
3.命令缓冲区:MTLCommandBuffer
Metal中,创建一个类型几乎都是使用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 渲染描述符是否创建成功,否则则跳过任何渲染.
if(renderPassDescriptor != nil)
{
//6.通过渲染描述符renderPassDescriptor创建MTLRenderCommandEncoder 对象
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
renderEncoder.label = @"MyRenderEncoder";
//7.我们可以使用MTLRenderCommandEncoder 来绘制对象,但是这个demo我们仅仅创建编码器就可以了,我们并没有让Metal去执行我们绘制的东西,这个时候表示我们的任务已经完成.
//即可结束MTLRenderCommandEncoder 工作
[renderEncoder endEncoding];
/*
当编码器结束之后,命令缓存区就会接受到2个命令.
1) present
2) commit
因为GPU是不会直接绘制到屏幕上,因此你不给出去指令.是不会有任何内容渲染到屏幕上.
*/
//8.添加一个最后的命令来显示清除的可绘制的屏幕
[commandBuffer presentDrawable:view.currentDrawable];
}
//9.在这里完成渲染并将命令缓冲区提交给GPU
[commandBuffer commit];
image.png
Metal中每一条渲染指令都是通过命令缓冲区来发送到GPU,
网友评论