vulkan从物理设备创建逻辑设备的时候,有个参数是QueueFamilyProperties,这个参数指明队列支持的功能,以及队列最大数量。

队列族支持的功能,用queueFlags表示,可以是,graphics,compute,transfer,还有SparseBinding。

通过查询QueueFamilyProperties,可以得到所有队列族的特性。我的gtx 1050支持的队列族是3个:

1.支持所有四种共功能

也就是Graphics|Compute|Transfer|SparseBinding,最大队列数16

2.支持Transfer,最大队列数1

3.支持compute,最大数量8

创建逻辑设备的时候,需要指定支持的队列族。我感觉实际上只需要第一个就可以,因为它是全功能的,而且有16个队列。或许专门的transfer队列和compute队列,可以发挥更好的性能。

查了一些资料,说队列数量并不是越多越好。如果用不上就少创建。因为每个队列都会消耗资源。具体如何消耗,还有待于探索。

 

探索1:

关于VulkanSharp的Device.GetQueue(uint queueFamilyIndex, uint queueIndex)

如果填入相同的queueFamilyIndex和queueIndex,会得到同一个队列,但是再VulkanSharp中用object.RefrenceEquals测试,并非是同一个对象,这是因为它每次GetQueue都创建了一个托管对象去包含原生指针,所以对象不同,但里面指针成员是同一个,所以实际是通过一个队列。

关于创建Device时候的QueueCreateInfo,

可以创建多个队列,但是QueueCount要等于QueuePriorities个数。如果不等,也能创建成功,但影响之后Device.GetQueue(familyIndex, queueIndex)的结果。这个函数中,queueIndex必须小于QueuePriorties的个数,否则会出现内存错误。

另外,QueueFamilyProperties中的最大队列数,似乎并不起作用,比如在Transfer队列族中创建两个队列(它最大是1),然后用Device.GetQueue取出来,的确是两个不同的队列。至于队列是否起作用,有待于进一步探索。