vulkan - 在 Vulkan 中,如果垂直空白到达时您还没有准备好要呈现的图像,那么使用 FIFO 会发生这种情况吗?

标签 vulkan

我是图形新手,一直在研究 Vulkan 演示模式。我想知道:在我们的交换链中只有 2 个图像(其中一个是屏幕当前正在读取的,另一个是空闲的)的情况下,如果我们无法在 之前完成对当前空闲图像的绘制,会发生什么情况?下一个垂直空白?我们是否进行演示并得到奇怪的撕裂,或者跳过演示并再次绘制相同的图像(我猜会产生“口吃”效果)?我们需要定义发生什么,还是自动发生?

顺便说一句,这就是人们使用更长交换链的原因吗?也就是说,如果您在屏幕显示最后一个图像时设法将 2 个图像绘制到交换链中,但现在您迟到了,至少您可以呈现之前 2 个图像中较新的一个?

我不确定其中有多少是特定于 FIFO 或邮箱模式的:我猜对于邮箱,您已经使用了最新的图像,所以您又陷入困境了吗? [2-图像交换链][1] [1]:/image/rxe51.png

最佳答案

在常规 FIFO(或邮箱)模式下永远不会发生撕裂。当您呈现图像时,该图像将用于所有后续 vblanks,直到呈现新图像。由于 FIFO 不允许撕裂,因此在您的情况下,图像将完全显示两次。

如果您使用带有 FIFO 的 2 深交换链,则必须按时生成每个图像以避免卡顿。有了更长的交换链和 FIFO,您就有更多的余地来避免明显的卡顿。使用更长的交换链和邮箱,您可以获得类似的效果,但当您的应用程序按时运行时,明显的延迟会更小。

关于vulkan - 在 Vulkan 中,如果垂直空白到达时您还没有准备好要呈现的图像,那么使用 FIFO 会发生这种情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71857995/

相关文章:

c++ - 调用 vkCreateInstance() 时出现奇怪的错误

c++ - 可以将 Lua 转换为 spir-v 吗?

android - 我是否必须创建一个 native Activity 来获取窗口,或者我可以从 Android 设备上的窗口管理器为 vulkan 应用程序提供一个?

glsl - 在 Vulkan 中使用 debugPrintfEXT

c++ - 在 Vulkan 中,将图形队列家族与当前队列家族分开是否有益?

multithreading - 使用多线程渲染时必须使用辅助命令缓冲区吗?单队列与多队列怎么样?

vulkan - pViewports 始终未使用

c++ - vkCreateInstance 抛出段错误

vulkan - 如何限制Vulkan中的帧速率

image - VK_IMAGE_LAYOUT_UNDEFINED 与 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL 作为帧缓冲区附件的初始布局