Metal 系列二:GPU Devices

本文深入探讨了Metal框架中GPU Devices的使用,包括获取设备、查询属性、创建命令队列、渲染管线和计算管线等关键步骤。重点介绍了基于图块的延迟渲染技术在A11 GPU上的优化,以及Metal 2带来的性能提升。此外,还涵盖了GPU Family 4的特性,如imageblocks、tile shading和光栅顺序组等功能。
摘要由CSDN通过智能技术生成
获取设备默认的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.使用MTLCopyAllDevicesWithObserver,可以获取可用的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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值