1. MTKView
在MetalKit
中提供了一个视图类MTKView
,类似于GLKit
中GLKView
,它是NSView
(macOS中的视图类)或者UIView
(iOS、tvOS中的视图类)的子类。用于处理metal绘制并显示到屏幕过程中的细节
MTKView *_mtkView = [[MTKView alloc] init];
2. MTLDevice
Metal
是操作GPU
的,所以需要获取GPU
使用权限,即拿到GPU
对象,Metal
中提供了MTLDevice
协议表示GPU
接口,在iOS
中一般是通过默认的方式获取GPU
注:运行Metal
必须是真机且6s以上机型(A7以上)
_mtkView.device = MTLCreateSystemDefaultDevice();
//判断是否设置成功,因为后面有很多地方需要用到device,如果不成功就没什么意义了
if (!view.device)
{
NSLog(@"Metal is not supported on this device");
return;
}
3. MTLCommandQueue
MTLDevice创建成功,在获取了GPU
之后,还需要一个渲染队列MTLCommandQueue
,这个队列是与GPU
交互的第一个对象,队列MTLCommandQueue
中存储的是将要进行渲染的命令MTLCommandBuffer
。
每个命令队列的生命周期很长,因此commandQueue
可以重复使用,而不是频繁创建和销毁
//创建命令队列
_commandQueue = [_device newCommandQueue];
4. MTLCommandBuffer
命令缓冲区主要是用于存储编码的命令,其生命周期是直到缓冲区被提交到GPU
执行为止,单个的命令缓冲区可以包含不同的编码命令,主要取决于用于构建它的编码器的类型和数量
//为当前渲染的每个渲染传递创建一个新的命令缓冲区
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
//指定缓冲区名称
commandBuffer.label = @"myCommandBuffer";
MTLCommandBuffer
对象的提交,是提交到MTLCommandQueue
对象中的。只有在提交后开始执行,通过入队顺序执行。有两种执行方式:
-
enqueue
: 顺序执行 -
commit
: 插队尽快执行,如果前面有commit
还是需要排队等着
5. MTLRenderCommandEncoder
命令编码器表示单个渲染过程中相关联的渲染状态和渲染命令,有以下功能:
- 指定图形资源,例如缓存区和纹理对象,其中包含顶点、片元、纹理图片数据
- 指定一个
MTLRenderPipelineState
对象,表示编译的渲染状态,包含顶点着色器和片元着色器的编译&链接情况 - 指定固定功能,包括视口、三角形填充模式、剪刀矩形、深度、模板测试以及其他值
- 绘制3D图元
MTLRenderCommandEncoder
的创建,需要渲染描述符MTLRenderPassDescriptor
//1.从视图绘制中,获得渲染描述符
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
//2.判断renderPassDescriptor 渲染描述符是否创建成功,否则则跳过任何渲染.
if (renderPassDescriptor != nil)
{
//3.创建MTLRenderCommandEncoder 对象
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
//4.给Encoder命名
renderEncoder.label = @"MyRenderEncoder";
//5.Metal文件的绘制操作
//...
//6.结束工作
[renderEncoder endEncoding];
}
6. MTKViewDelegate
响应MetalKit视图的绘图和调整大小事件的方法。
- 更改视图的布局:
mtkView:drawableSizeWillChange:
收到布局,分辨率或大小的更改后,更新视图的内容。 - 绘制视图的内容:
drawInMTKView:
绘制视图的内容。