获取设备默认的GPU设备:
代码:
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError( "Failed to get the system's default Metal device." )
}
为了使用Metal framework,首先应该获取GPU设备,app中所有和Metal有联系的对象,都来自获取的GPU设备。并且,只需要获取一次即可。
MTLDevice protocol
它定义了GPU的接口:
1.可以在GPU设备中查询是否对APP的Metal提供特殊功能。
2.使用GPU设备发出所有Metal commend(命令)
3.不要自己实现此协议,相反,要从上文我们介绍的MTLCreateSystemDefaultDevice()
方法中获取Device
4.使用MTLCopyAllDevicesWithObserve
r,可以获取可用的GPU设备
5.有关选择正确的GPU设备的讨论,请查考:Getting the Default GPU
GPU 设备是我们在Metal中做任何操作的首要对象,因此,所有的app中涉及到的Metal对象都是来自运行时获得的MTLDevice实例。
Device被创建,代价十分昂贵,同事也是持久的,大多数被设计为只初始化一次 only once,并且真个生命周期都在重用。
但是,GPU设备创建的对象特定于发布它们的GPU,因此如果您将中间运行切换为使用不同的GPU,那么您也可以从新的GPU设备创建一组新的命令对象。
MTLDevice protocol 摘要:
1.获取设备
https://blog.csdn.net/Xoxo_x/article/details/83627918
2.查询属性
https://blog.csdn.net/Xoxo_x/article/details/83628273
3.查询特性
https://blog.csdn.net/Xoxo_x/article/details/83628273
4.创建命令队列
https://blog.csdn.net/Xoxo_x/article/details/83628589
5.同步命令集合
https://blog.csdn.net/Xoxo_x/article/details/83628589
6.获取 shader 方法
https://blog.csdn.net/Xoxo_x/article/details/83628928
7.创建渲染管线
https://blog.csdn.net/Xoxo_x/article/details/83663080
8.创建计算管道
https://blog.csdn.net/Xoxo_x/article/details/83663080
9.查询内存可用性
https://blog.csdn.net/Xoxo_x/article/details/83663098
10.创建缓冲
https://blog.csdn.net/Xoxo_x/article/details/83663113
11.创建纹理和取样
https://blog.csdn.net/Xoxo_x/article/details/83663135
12.创建参数缓冲区
https://mp.csdn.net/mdeditor/83663190
13.创建间接命令缓冲区
https://mp.csdn.net/mdeditor/83663190
14.创建资源堆和围栏
https://mp.csdn.net/mdeditor/83663190
15.创建深度和模板状态
https://mp.csdn.net/mdeditor/83663190
16.查询可编程样品位置
https://mp.csdn.net/mdeditor/83663190
17.查询光栅订单组支持
https://mp.csdn.net/mdeditor/83663190
了解如何为特定类型的iOS和tvOS设备开发Metal应用程序,如果你想开发Metal的APP最好要熟悉不同CPU的特性。
前文我们提到,MTLDevice 协议的作用:
1.可以在GPU设备中查询是否对APP的Metal提供特殊功能。
2.使用GPU设备发出所有Metal commend(命令)
3.不要自己实现此协议,相反,要从上文我们介绍的MTLCreateSystemDefaultDevice()方法中获取Device
4.使用MTLCopyAllDevicesWithObserver,可以获取可用的GPU设备
5.有关选择正确的GPU设备的讨论,请查考:Getting the Default GPU
下面我们来看一下,不同设备的特性
About GPU Family 4 :
了解A11功能,包括光栅顺序组,平铺着色器和图像块。
概观
GPU系列4描绘了A11芯片及其Apple设计的图形处理器(GPU)架构所支持的新功能和性能增强。
iOS和tvOS设备中的GPU实现了一种称为基于图块的延迟渲染(TBDR)的渲染技术,以优化性能和功效。在传统的立即模式(IM)渲染器中,当三角形被提交给GPU进行处理时,它会立即呈现给设备内存。三角形由光栅化和片段函数阶段处理,即使它们被稍后提交给GPU的其他基元遮挡。
基于平铺的延迟渲染
TBDR对IM架构进行了一些重大更改,在提交了所有基元后处理场景。屏幕被拆分为单独处理的图块。同时处理与图块相交的所有几何图形,并在光栅化和片段着色阶段之前丢弃被遮挡的图像。将磁贴渲染到GPU上的快速本地存储器中,并且仅在渲染完成后才将其写入设备存储器。
TBDR允许顶点和片段阶段异步运行 - 相对于IM提供显着的性能改进。在运行渲染过程的片段阶段时,硬件并行执行未来渲染过程的顶点阶段。顶点阶段通常大量使用固定功能硬件,而片段阶段则使用数学和带宽。完全重叠它们允许设备同时使用GPU上的所有硬件模块。
TBDR使用的磁贴存储器有三个重要特征。首先,着色器核心和瓦片存储器之间的带宽比GPU和设备存储器之间的带宽高许多倍,并且与着色器核心的数量成比例地缩放。其次,磁贴内存的内存访问延迟比访问设备内存的延迟低许多倍。最后,磁贴内存消耗的功率远低于设备内存。
在基于A7到A10的设备上,Metal没有明确描述这种基于图块的架构; 相反,您使用它来提供底层实现的提示。例如,加载和存储操作控制将哪些数据加载到本地存储器以及将哪些数据写入设备存储器。类似地,无记忆缓冲区指定仅在渲染通道期间使用的每像素中间数据; 实际上,这些数据存储在GPU的快速本地存储器中。
A11 GPU上的Metal2
A11中Apple设计的GPU提供了几项显着增强TBDR的功能。这些功能通过其他Metal 2 API提供,使您的应用和游戏能够实现更高水平的性能和功能。
这些功能包括图像块,图块着色,光栅顺序组和图像块样本覆盖控制。A11 GPU上的金属2还可以提高碎片丢弃性能。
从广义上讲,这些功能可以更好地控制内存布局和存储在磁贴中的数据,并提供更细粒度的同步,以便在GPU上保持更多工作。最终结果是,您可以在单个渲染过程中执行比以前更多种类的计算,从而将计算保持在快速本地内存中。
A11上的金属2还简化了诸如次表面散射,与顺序无关的透明度和基于图块的照明算法等技术的实现。
GPU Family 4 Features
关于Imageblocks
了解imageblocks如何允许您在高带宽磁贴内存中定义和操作自定义每像素数据结构。
关于瓷砖底纹
了解在共享本地内存时将渲染和计算操作组合到单个渲染过程中。
关于光栅订单组
了解精确控制访问相同像素坐标的并行片段着色器线程的顺序。
关于增强的MSAA和Imageblock样本覆盖控制
了解如何在切片着色器中访问多重采样跟踪数据,启用自定义MSAA解析算法的开发等。
其他协议方法:
//返回对首选系统默认Metal设备的引用
func MTLCreateSystemDefaultDevice() -> MTLDevice?
Returns a reference to the preferred system default Metal device.
//返回对系统中所有Metal设备的引用数组
func MTLCopyAllDevices() -> [MTLDevice]
Returns an array of references to all Metal devices in the system.
//返回系统中所有Metal设备的引用数组,观察者接收设备通知
func MTLCopyAllDevicesWithObserver(handler: MTLDeviceNotificationHandler) -> (devices: [MTLDevice], observer: NSObject)
Returns an array of references to all Metal devices in the system, with an observer to receive device notifications.
//删除已注册的设备通知观察者
func MTLRemoveDeviceObserver(NSObjectProtocol)
Removes a registered observer of device notifications.
//一个布尔值,指示设备是否配置为无头
var isHeadless: Bool
A Boolean value that indicates whether a device is configured as headless.
Required.
//一个布尔值,指示设备是否为低功耗
var isLowPower: Bool
A Boolean value that indicates whether a device is low-power.
Required.
//一个布尔值,用于确定GPU是否可移动。
var isRemovable: Bool
A Boolean value that determines whether or not a GPU is removable.
Required.
//设备的注册表ID值。
var registryID: UInt64
The registry ID value for the device.
Required.
//设备的名称
var name: String
The name of the device.
Required.
//设备功能集定义特定的平台,硬件和软件配置
enum MTLFeatureSet
The device feature sets that define specific platform, hardware, and software configurations.
//返回一个布尔值,指示设备是否支持特定功能集。
func supportsFeatureSet(MTLFeatureSet) -> Bool
Returns a Boolean value that indicates whether a device supports a particular feature set.
Required.
Metal功能集定义了每个设备的功能可用性,实现限制和像素格式功能:
Table 1
GPU families and their corresponding GPU hardware
GPU family
GPU hardware
iOS GPU family 1: Apple A7 devices
(iOS GPU family 2、 tvOS GPU family )1 :Apple A8 devices
(iOS GPU family 3、 tvOS GPU family 2 ) Apple A9 devices Apple A10 devices
iOS GPU family 4 Apple A11 devices
macOS GPU family 1 :
{
iMac Pro models
iMac models from 2012 or later
MacBook models from 2015 or later
MacBook Pro models from 2012 or later
MacBook Air models from 2012 or later
Mac mini models from 2012 or later
Mac