Vulkan的各种presentation mode
Presentation mode是什么
在创建vulkan的swap chain的时候,我们有一项必须要指定的便是VkPresentModeKHR,这个是用来控制swap chain中的对象是如何显示到我们的屏幕之上。总的来看,vulkan支持以下4种方案:
VK_PRESENT_MODE_IMMEDIATE_KHRVK_PRESENT_MODE_FIFO_KHRVK_PRESENT_MODE_FIFO_RELAXED_KHRVK_PRESENT_MODE_MAILBOX_KHR
并且在这4种方案中,只有VK_PRESENT_MODE_FIFO_KHR是vulkan规定必须要支持的显示模式,其他的不做要求。
VK_PRESENT_MODE_IMMEDIATE_KHR
这个模式是最简单的一种情况,你渲染出来的图片直接就会被扔到显示器上进行显示,不会做任何同步。这种模式一般情况下是用来最大化你的fps的,通常强调输入延迟的fps游戏会搞这种显示模式。
VK_PRESENT_MODE_FIFO_KHR & VK_PRESENT_MODE_MAILBOX_KHR
这两个可以放在一起说,基本上FIFO就是在一个固定的同步周期(即Vertical sync)里面,我们每次同步,都把当前渲染队列的第一张图拿出来给显示器来进行使用,这也是为什么这个模式会叫作FIFO,也就是先进先出模式。
MAILBOX总的来看的话就是FIFO的一个变种,但是不同的是,在FIFO中,每个framebuffer在被显示到屏幕之前,是不会重新绘制的,它会一直等到被显示到屏幕上。这也是问什么我们我会在图中看到FIFO模式下的绘制和呈现可能会有一个非常长的间隔,这无疑会增加玩家所感受到的输入延迟。MAILBOX的则改进了这个问题,这种模式下的GPU永不停歇,只要能画它就会去画,完全不考虑该framebuffer中图像是否已经被显示过。但是当然会带来一个问题就是很多的图像虽然被渲染了,但是并没有呈现到屏幕上,造成了很多资源浪费,而且GPU一直满载跑也很耗电,对移动端不是非常友好。
VK_PRESENT_MODE_FIFO_RELAXED_KHR
这个模式就有点像FIFO和IMMEDIATE的混合体,Vulkan Specs将其描述为下
VK_PRESENT_MODE_FIFO_RELAXED_KHRspecifies that the presentation engine generally waits for the next vertical blanking period to update the current image. If a vertical blanking period has already passed since the last update of the current image then the presentation engine does not wait for another vertical blanking period for the update, meaning this mode may result in visible tearing in this case.
大意就是如果应用程序延迟,导致交换链的队列在上一次同步时为空,那么,如果应用程序在下一次同步前提交图像,图像会立即被显示,这一模式可能会导致画面撕裂现象。