写在前面:
对Metal技术感兴趣的同学,可以关注我的专题:Metal专辑
也可以关注我个人的简书账号:张芳涛
所有的代码存储的Github地址是:Metal
Metal framework介绍
在WWDC 2014 iOS和WWDC 2015上发布的Metal framework也适用于OS X和tvOS。 Metal是用于编程计算机中图形处理单元(GPU)的界面。 使用Metal的主要优点如下:
提供对
GPU最低的访问开销,因此可以减少通常由其他框架中的CPU和GPU之间的数据传输所导致的性能方面的瓶颈。与
OpenGL相比,提供最多10倍的绘制调用次数(性能更强悍)。 然而,Metal不像OpenGL那样是跨平台的,所以它不能代替OpenGL。还允许运行具有与
CUDA或OpenCL等类似技术相媲美的性能水平的计算应用程序。有一个自定义着色器语言(shader language),允许着色器预编译,以便在运行时更快速。
具有专门针对这些平台的内置内存和资源管理。
MAC电脑客户端相关技术实现
Metal是不允许在模拟器上运行的,而且即使在真机上也需要真机设备的芯片是A7以后的CPU芯片。所以这里用的是电脑的程序来演示(不过,因为我也是边翻译,边学习,所以,我会在后面给大家提供手机的相关代码的,这一点请大家放心)。

接下来,转到ViewController.swift并为我们刚刚创建的标签创建一个IBOutlet。 OSX平台下面的演示代码如下:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var label: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
let devices = MTLCopyAllDevices()
guard let _ = devices.first else {
fatalError("Your GPU does not support Metal!")
}
label.stringValue = "Your system has the following GPU(s):\n"
for device in devices {
label.stringValue += "\(device.name!)\n"
}
}
}
- 具体的代码地址:Ch01-OSX
我们来看看上面的代码。 首先,我们需要导入Metal,因为我们调用属于Metal框架的MTLCopyAllDevices()函数。 但是,由于Cocoa已经导入了Metal和AppKit框架,它允许我们使用NSViewController类,所以我们不需要为Metal添加另一条导入线。
然后,在viewDidLoad()内部就是所有功能发生的地方。 我们通过调用MTLCopyAllDevices()来创建一个Metal设备,然后我们简单地查询它的名称,以便我们可以将它显示为标签文本。 请注意,MTLCopyAllDevices()仅在OS X中可用。对于iOS / tvOS设备,请使用MTLCreateSystemDefaultDevice()。 设备是GPU的抽象,为我们提供了一些方法和属性,例如上面使用的名称。
如果您运行该项目,您应该能够看到以下输出:

iOS设备相关技术实现
上面是在OSX平台下面的相关代码,下面介绍在iOS系统下面相关效果的实现:
iOS设备上的先关代码实现如下:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Your GPU does not support Metal!")
}
label.text = "Your system has the following GPU(s):\n" + "\(device.name)\n"
}
}
下面是执行的结果:

*iOS平台相关代码:Ch01-iOS
TVOS相关技术实现
下面是TvOS平台下面的实现:
实现代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Your GPU does not support Metal!")
}
label.text = "Your system has the following GPU(s):\n" + "\(device.name)\n"
}
}
效果图:

-
TvOS平台相关代码:Ch01-TvOS