00e5726123a288d45d0b4ef1043c2997
iOS 开发者的 Metal 养成计划「1」 —— 与 Metal 的邂逅

目录

  • 引言
  • Metal
    • MTLDevice
    • MTLCommandQueue
    • MTLLibrary
    • MTLHeap
    • MTLFence
  • 小结
  • 更新计划

引言

Metal 已经问世很久了,相信大多数 iOS 开发者都知道它是什么。

随着公司的项目不再支持 iOS 7,Metal 时代已经全面到来了。是的,我们现在才放弃 iOS 7,因为仍然有超过 1% 的用户,对于一个日活过亿的产品,用户数量确实还不小。

言归正传,关于 Metal 引用前几天微博里的话:

Metal 对于我这种一直写 OpenGL 的人简直是一种救赎。

它解决了很多 OpenGL 的痛点,尤其是学习曲线陡峭这个问题。对于被面向对象开发惯坏了,完全无法理解 OpenGL 这类纯面向过程和状态的开发的同学,大大降低了入门门槛。

Metal

我这么理解 Metal:它是一套面向 GPU 编程 API,设计上位于 OpenGL 同一层。附上「官方文档」

熟悉 OpenGL 的同学,对于它的很多内容一眼就能看出来是干什么的,两者的思路几乎是完全一致的,学习成本非常低。那么对于不熟悉 OpenGL 的同学,它的学习成本要比 OpenGL 低得多得多。由于它们的思路是一致的,所以甚至可以选择先学习 Metal。

那么以上就是 Metal 的架构图。由MTLDevice出发,维护了一个MTLCommandQueue队列,队列中会有待处理的MTLCommandBuffer,而MTLLibrary负责加载写好的着色器程序并返回MTLFunction对象,MTLHeap封装有助于管理显存堆内存,MTLFence则是用来处理共享资源冲突的问题的。

MTLDevice

首先可以惊讶地发现,OpenGL 中贯穿生命的上下文(Context)这个鬼畜的东西不见了,取而代之的是MTLDevice。虽然这两者的概念有区别,但一般使用 OpenGL 时是以单个上下文使用的,在这个前提下,这两者没有区别。

The MTLDevice protocol defines the interface to a single graphics processor unit (GPU).

MTLDevice是 GPU 的入口。在 macOS 上,可以使用官方文档中提到MTLCopyAllDevices()这个方法,可以拿到 macOS 上所有的显卡。这个方法在 iOS 里是用不了的。

获得这个入口很容易:

  • guard let device = MTLCreateSystemDefaultDevice() else {
  • // error
  • }

那么之后所有关于 Metal 的操作,都会从这个MTLDevice出发。

```swift
// 获得 MTLCommandQueue
guard let commandQueue = device.makeCommandQueue() else {
// error
}
// 获得 MTLLibrary
guard let library = device.makeDefaultLibrary() else {
// error
}
// ...

top Created with Sketch.