Vulkan选择交换链图像

选择交换链图像
当应用程序想要渲染交换链图像时,必须从显示引擎获取交换链图像。一个应用程序可以获取多幅图像,没有同一时刻只能获取一幅图像的限制。但是应用程序能够获取图像(某一时刻显示引擎还未使用的图像)的数量,由具体的显示模式、应用程序的当前状态(渲染/显示历史记录)及在创建交换链时设定的交换链图像(最小)数量决定。

具体处理过程
(1)获取显示曲面的功能(请参阅“获取显示曲面的功能”小节)。将这些数据存储在一个VkSurfaceCapabilitiesKHR类型的变量中,将该变量命名为surface_capabilities。
(2)创建一个uint32_t类型的变量,将其命名为number_of_images。
(3)将surface_capabilities.minImageCount+1赋予number_of_images变量。
(4)查明surface_capabilities变量中maxImageCount成员的值是否大于0。如果该值大于0,则意味着显示曲面的功能中存在创建图像数量的上限。在这种情况下,应查明number_of_images变量的值是否大于surface_capabilities.maxImageCount成员的值。如果number_of_images变量的值大于surface_capabilities.maxImageCount成员的值,应调整number_of_images变量的值,使之处于surface_capabilities变量中maxImageCount成员的值所限定的范围内。

具体运行情况
随交换链一起创建的图像(以自动方式)主要用于显示,而且这些图像还能使显示引擎正常运行。屏幕上(总是)会显示一幅图像,在这幅图像被另一幅图像替换前,应用程序无法使用这幅图像。被显示的图像会立刻替换先前显示的图像,也可能会在图像队列中等待适当的时机再替换先前显示的图像(在垂直同步模式中),这都取决于已设定的显示模式。应用程序可以获取已经被替换下来的在屏幕上显示过的图像。

应用程序只能获取当前处于未使用状态的图像(请参阅“选择显示模式”小节),且可以获取所有处于未使用状态的图像。但是当获取的未使用的图像数量达到上限后,就需要先将这些未使用图像中的一幅或多幅(至少一幅)显示在屏幕上,才能继续获取未使用的图像;否则,获取图像的操作就会一直被阻塞。

未使用图像的数量主要取决于设定的显示模式和随交换链创建图像的总数。因此,应根据我们想要实现的渲染方案(同一时刻应用程序能够获取的图像数量上限)和选定的显示模式,决定创建多少图像。

可使用下面的代码设置图像数量下限。

Vulkan选择交换链图像
通常,在最典型的渲染场景中,应用程序需要在指定的时间渲染单个图像。因此,创建图像的数量达到显示曲面支持的图像数量下限就足够了。创建更多图像能够使应用程序在同一时刻获取更多图像,但更为重要的是,在实现了合适渲染算法的情况下,这还会提高应用程序的性能。然而,图像会占用大量内存。因此,应综合考虑我们的需求、内存使用情况和应用程序的性能等因素,来设置交换链图像的数量。

通过这种综合性考虑,本例将应用程序能够获取的图像数量设置为,比能够使显示引擎正常运行的图像数量的下限大1。此后,还需要查明显示曲面支持的图像数量上限是否存在,以及我们设置的应用程序能够获取的图像数量是否大于该值。如果我们设置的应用程序能够获取的图像数量大于该值,就应减少应用程序能够获取的图像数量,使之处于显示曲面支持的图像数量范围内。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战