Metal入门资料001-Metal framework介绍

96
张芳涛
2018.06.05 18:07* 字数 802

写在前面:

对Metal技术感兴趣的同学,可以关注我的专题:Metal专辑
也可以关注我个人的简书账号:张芳涛
所有的代码存储的Github地址是:Metal

Metal framework介绍

WWDC 2014 iOS和WWDC 2015上发布的Metal framework也适用于OS XtvOSMetal是用于编程计算机中图形处理单元(GPU)的界面。 使用Metal的主要优点如下:

  • 提供对GPU最低的访问开销,因此可以减少通常由其他框架中的CPUGPU之间的数据传输所导致的性能方面的瓶颈。

  • OpenGL相比,提供最多10倍的绘制调用次数(性能更强悍)。 然而,Metal不像OpenGL那样是跨平台的,所以它不能代替OpenGL

  • 还允许运行具有与CUDAOpenCL等类似技术相媲美的性能水平的计算应用程序。

  • 有一个自定义着色器语言(shader language),允许着色器预编译,以便在运行时更快速。

  • 具有专门针对这些平台的内置内存和资源管理。

MAC电脑客户端相关技术实现

Metal是不允许在模拟器上运行的,而且即使在真机上也需要真机设备的芯片是A7以后的CPU芯片。所以这里用的是电脑的程序来演示(不过,因为我也是边翻译,边学习,所以,我会在后面给大家提供手机的相关代码的,这一点请大家放心)。

接下来,转到ViewController.swift并为我们刚刚创建的标签创建一个IBOutletOSX平台下面的演示代码如下:

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"
    }
   }
 }

我们来看看上面的代码。 首先,我们需要导入Metal,因为我们调用属于Metal框架的MTLCopyAllDevices()函数。 但是,由于Cocoa已经导入了MetalAppKit框架,它允许我们使用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"
 }
}

效果图:

这个也必须用真机测试
FFmpeg
Web note ad 1