MTKView & MTLCommandBuffer

2020-05-25  本文已影响0人  tp夕阳武士
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,

上一篇 下一篇

猜你喜欢

热点阅读