写在前面:
对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