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

发布于:2018-01-12 17:17,阅读数:509,点赞数:0


> 本文为小专栏[《Graphics Dance》](https://xiaozhuanlan.com/graphics_dance)特供文章,仅提供预览,欢迎订阅。

# 目录

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

# 引言

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

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

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

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

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

# Metal

我这么理解 Metal:它是一套面向 GPU 编程 API,设计上位于 OpenGL 同一层。附上[「官方文档」](https://developer.apple.com/library/content/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Blit-Ctx/Blit-Ctx.html#//apple_ref/doc/uid/TP40014221-CH9-SW3)。

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

![](//cdn.yuusann.com/img/corpus/18004_1.png)

那么以上就是 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 里是用不了的。

![](//cdn.yuusann.com/img/corpus/18004_2.png)

获得这个入口很容易:

```swift
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
}
// ...
```

对于被面向对象编程惯坏了的读者们来说,这是一个救赎:`OpenGL 对 GPU 编程是完全面向过程的,而 Metal 是完全面向对象的。`

---

# 预览结束,查看全文请订阅小专栏[《Graphics Dance》](https://xiaozhuanlan.com/topic/1370426958)


评论:0条


返回列表

返回归档

返回主页