美文网首页
MTKView & MTLCommandBuffer

MTKView & MTLCommandBuffer

作者: tp夕阳武士 | 来源:发表于2020-05-25 16:47 被阅读0次
    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,

    相关文章

      网友评论

          本文标题:MTKView & MTLCommandBuffer

          本文链接:https://www.haomeiwen.com/subject/pegyahtx.html