MTLCommandQueue
对象用于对命令缓冲区的有序列表进行排队,以便 MTLDevice
执行。指令队列是线程安全的,允许同时编码多个未完成命令的缓冲区。
要创建命令队列,请调用MTLDevice
对象的makeCommandQueue()
或makeCommandQueue(maxCommandBufferCount :)
方法。 makeCommandQueue(maxCommandBufferCount :)
方法返回队列限制未完成的命令缓冲区的数量。通常,您在初始化应用程序时创建一个或多个命令队列,然后在应用程序的整个生命周期内保留这些队列。
为了渲染图像或执行计算操作,使用命令队列创建一个或多个指令缓冲区对象,然后将指令编码到这些对象中并将它们提交到队列。创建 MTLCommandBuffer
对象有两种方法:makeCommandBuffer()
和 makeCommandBufferWithUnretainedReferences()
。在大多数情况下,您使用makeCommandBuffer()
方法,因为它创建了一个指令缓冲区,该缓冲区包含对完成执行指令缓冲区中编码的命令所需的任何对象的强引用。在极少数情况下,您使用makeCommandBufferWithUnretainedReferences()
方法创建一个命令缓冲区,该缓冲区不会保留对这些对象的强引用。在这种情况下,您负责保持这些对象处于活动状态,直到命令缓冲区中编码的命令完成执行为止。
//返回值为指令缓冲区对象
func makeCommandBuffer() -> MTLCommandBuffer?
此方法返回遵循正常内存管理约定的命令缓冲区,并保证对由其创建的任何命令编码器引用的对象(如缓冲区,纹理,采样器和状态对象)保持强引用。这些引用一直持续到命令执行完成。
此方法将返回的命令缓冲区的retainedReferences属性设置为true。
如果命令队列使用最大数量的命令缓冲区进行实例化,并且应用程序已经有许多缓冲区等待执行,则此方法将阻塞,直到其中一个缓冲区变为可用。
//不包含对任何对象的引用的命令缓冲区对象
func makeCommandBufferWithUnretainedReferences() -> MTLCommandBuffer?
makeCommandBuffer()方法生成命令缓冲区,用于维护对执行缓冲区时使用的对象的引用;这可以保证在执行缓冲区时对象就在那里。使用此方法仅在极其性能关键的应用程序中生成命令缓冲区,其中添加和删除对对象的强引用的成本很高。如果确实使用此方法,则必须保证应用程序保持对命令缓冲区引用的所有对象的强引用,直到其命令执行完毕。如果在执行缓冲区命令之前释放对象,则结果是未定义的。此方法将返回的命令缓冲区的retainedReferences属性设置为false。
//创建命令队列的设备
var device: MTLDevice { get }
//标识命令队列的字符串
var label: String? { get }