Metal入门001-初识Metal
Metal入门002-Metal相关API
本文通过渲染背景色这个小案例,展现Metal语法的实际编程效果
流程如下:
- 获取
MTKView
- 设置
Device
- 创建
Render
3.1 初始化创建commandQueue
3.2 渲染Delegate
方法 - 设置
MTKViewDelegate
- 设置帧速率
1. 设置MTKView
- 可以在storyboard将
UIView
的类改为MTKView
- 可以创建
MTKView
对象,再将其添加到控制器的view
中
_mtkView = (MTKView *)self.view;
2. 设置Device
一个MTLDevice
对象代表着一个GPU
,一般使用默认方法MTLCreateSystemDefaultDevice
来获取默认的单个GPU
对象
注:运行Metal
必须是真机且6s以上机型(A7以上)
_mtkView.device = MTLCreateSystemDefaultDevice();
//判断是否设置成功
if (!_mtkView.device) {
NSLog(@"Metal is not supported on the device");
return;
}
3. 创建Render
Apple建议在开发Metal
程序的时候,最好将渲染循环独立写成一个类,目的是为了更好管理Metal
及Delegate
_render = [[ColorRender alloc] initWithMTKView:_mtkView];
if (!_render) {
NSLog(@"Renderer failed initialization");
return;
}
3.1初始化创建commandQueue
所有应用程序需要与GPU
交互的第一个对象是一个对象(MTLCommandQueue
)
你使用MTLCommandQueue
去创建对象,并且加入MTLCommandBuffer
对象中.确保它们能够按照正确顺序发送到GPU
.对于每一帧,一个新的MTLCommandBuffer
对象创建并且填满了由GPU执行的命令.
- (instancetype)initWithMTKView:(MTKView *)mtkView
{
self = [super init];
if (self) {
_device = mtkView.device;
_commandQueue = [_device newCommandQueue];
}
return self;
}
3.2 drawInMTKView代理方法
通过设置view
的帧速率,每当到指定时间时,就会触发view
的渲染,继而回调drawInMTKView
代理方法进行绘制渲染.
流程如下:
- 获取当前帧显示的颜色
Color color = [self makeFancyColor];
- 设置
view
的颜色
view.clearColor = MTLClearColorMake(color.red, color.green, color.blue, color.alpha);
- 创建渲染缓冲区,使用
MTLCommandQueue
创建对象并且加入到MTCommandBuffer
对象中去,为当前渲染的每个渲染传递创建一个新的命令缓冲区
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
commandBuffer.label = @"MyCommand";
- 获取渲染描述修饰符,通过
commandQueue
获取,类型是MTLRenderPassDescriptor
,用于在commandBuffer
中创建commandEncoder
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
- 创建
commandEncoder
,通过渲染描述符renderPassDescriptor
创建MTLRenderCommandEncoder
对象,即命令渲染编辑器(相当于OpenGL的program)
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
renderEncoder.label = @"MyRenderEncoder";
- 当没有需要绘制的任务时,结束
MTLRenderCommandEncoder
工作
[renderEncoder endEncoding];
- 渲染到屏幕上,添加一个最后的命令来显示清除的可绘制的屏幕当编码器结束工作后,命令缓存区会收到两个命令:
-
present
命令:渲染到屏幕上 -
commit
命令:将commandBuffer
提交至GPU
主要是因为GPU
不会直接渲染到屏幕上,如果不给命令,那么绘制的内容是不会显示到屏幕上的
-
[commandBuffer presentDrawable:view.currentDrawable];
- 完成渲染并将命令缓冲区提交给
GPU
[commandBuffer commit];
4. 设置MTKView的Delegate
设置MTKView
的代理(由Render
来实现MTKView
的代理方法)
_mtkView.delegate = _render;
4. 设置帧速率
视图可以根据视图属性上设置帧速率(指定时间来调用drawInMTKView
方法--视图需要渲染时调用)
_mtkView.preferredFramesPerSecond = 60;
完整demo见github