Metal
Metal
是一个和 OpenGL ES
类似的面向底层的图形编程接口,可以直接操作GPU;并在iOS,macOS和tvOS上提供图形渲染和通用计算能力;
Metal不支持模拟器,仅支持真机,切仅支持A7处理器之上的设备。
Metal的特性

- cpu低开销
- Metal可以在苹果系统下发挥GPU最大的性能
- 最大限度发挥 CPU/GPU 的并发性(硬件加速器)
- 有效的资源管理
图形管线(Graphics pipeline)
Metal把输入、处理、输出的管道看成是对指定数据的渲染指令,比如输入顶点数据,输出渲染后纹理。
MTLRenderPipelineState
表示渲染管道,最主要的三个过程:顶点处理、光栅化、片元处理。

Metal命令对象(Metal Command Objects)

- 命令缓存区
command buffer
是从命令队列(command queue
) 创建的 - 命令编码器(
command encoders
) 将命令编码到命令缓冲区 - 提交命令缓存区将其发送到GPU
- GPU执行命令将结果呈现为可绘制

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;
网友评论