iOS 开发者的 Metal 养成计划「1」 —— 与 Metal 的邂逅
发布于:2018-01-12 17:17,阅读数:1008,点赞数: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.blog.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.blog.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条