Metal
Metal 是一个和 OpenGL ES类似的面向底层的图形编程接口,可以直接操作GPU;并在iOS,macOS和tvOS上提供图形渲染和通用计算能力;
Metal不支持模拟器,仅支持真机,切仅支持A7处理器之上的设备。
Metal的特性
Metal特性.png
- cpu低开销
- Metal可以在苹果系统下发挥GPU最大的性能
- 最大限度发挥 CPU/GPU 的并发性(硬件加速器)
- 有效的资源管理
图形管线(Graphics pipeline)
Metal把输入、处理、输出的管道看成是对指定数据的渲染指令,比如输入顶点数据,输出渲染后纹理。
MTLRenderPipelineState 表示渲染管道,最主要的三个过程:顶点处理、光栅化、片元处理。
常见得渲染管线.png
Metal命令对象(Metal Command Objects)
Cmd-Model.png
- 命令缓存区
command buffer是从命令队列(command queue) 创建的 - 命令编码器(
command encoders) 将命令编码到命令缓冲区 - 提交命令缓存区将其发送到GPU
- GPU执行命令将结果呈现为可绘制
Cmd-Object-Relation.png
Metal的使用建议
-
Separate Your Rendering Loop分开渲染循环:不希望将渲染的处理放到VC中,希望将渲染循环封装在一个单独的类中 -
Respond to View Events响应视图的事件,即MTKViewDelegate协议,也需要放在自定义的渲染循环中 -
Metal Command Objects创建一个命令对象,即创建执行命令的GPU、与GPU交互的MTLCommandQueue对象以及MTCommandBuffer渲染缓存区。
MTLDevice
MTLDevice是一个协议,用于表示GPU,通常使用MTLCreateSystemDefaultDevice获取默认的GPU。
一个遵循MTLDevice协议的对象,
MTLCreateSystemDefaultDevice();
MTLCommandQueue
所有应用程序需要与GPU交互的第一个对象,通常使用MTLDevice创建
使用MTLCommandQueue 去创建对象,并且加入MTLCommandBuffer对象中.确保它们能够按照正确顺序发送到GPU.对于每一帧,一个新的MTLCommandBuffer 对象创建并且填满了由GPU执行的命令.
- (id<MTLCommandQueue>)newCommandQueue;
MTLCommandBuffer
MTLCommandBuffer会提供一些encoder,对于一个commandBuffer,只有调用encoder的结束操作,才能进行下一个encoder的创建,同时可以设置执行完指令的回调。在MTLCommandEncoder把指令进行封装后,MTLCommandBuffer再做聚合到一次提交里。
- (nullable id <MTLCommandBuffer>)commandBuffer;
MTLCommandEncoder
-
编码绘制指令的
MTLRenderCommandEncoder,MTLRenderCommandEncoder在创建的时候,会隐式的调用一次clear的命令。获取MTLRenderCommandEncoder
- (nullable id <MTLRenderCommandEncoder>)renderCommandEncoderWithDescriptor:(MTLRenderPassDescriptor *)renderPassDescriptor;结束编码
- (void)endEncoding;添加绘制
- (void)presentDrawable:(id <MTLDrawable>)drawable;提交
- (void)commit; -
编码计算指令的
MTLComputeCommandEncoder、 -
编码缓存纹理拷贝指令的
MTLBlitCommandEncoder
MTLRenderPassDescriptor
MTLRenderPassDescriptor 是一个轻量级的临时对象,里面存放较多属性配置,供MTLCommandBuffer创建MTLRenderCommandEncoder对象用,一般通过MTKView获取,并且在每帧刷新时都会提供新的MTLRenderPassDescriptor。
@property (nonatomic, readonly, nullable) MTLRenderPassDescriptor *currentRenderPassDescriptor;
MetalKit
MTKView
MTKView用于处理metal绘制并显示到屏幕过程,默认MTKView会通过Draw loop一直刷新屏幕显示,如果设置paused为true,它就会暂停。
MTKViewDelegate
视口调整回调重绘
- (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size;
绘制视图内容
- (void)drawInMTKView:(MTKView *)view;














网友评论