为什么每个交换链图像都需要资源

Rhu*_*age 2 vulkan

我一直在关注不同的教程,但我不明白为什么我需要每个交换链图像而不是飞行中的每帧资源。

本教程:https : //vulkan-tutorial.com/Uniform_buffers

每个交换链图像都有一个统一的缓冲区。如果不同的图像不在同一时间飞行,为什么我需要它?如果前一帧已经完成,我可以不开始重写吗?

另外关于深度缓冲区的 lunarg 教程说:

并且您只需要一个来渲染每一帧,即使交换链有多个图像。这是因为您可以在使用交换链中的每个图像时重用相同的深度缓冲区。

这不能解释任何事情,它基本上说你可以,因为你可以。那么为什么我可以重用深度缓冲区而不是其他资源呢?

krO*_*oze 5

在简单的 Hello Cube 应用程序的情况下,它是为了最小化同步。

假设你的制服每帧都会改变。这意味着主循环类似于:

  1. 投票(或模拟)
  2. 更新(例如你的制服)
  3. 重复

如果步骤#2 没有自己的uniform,那么它需要写一个uniform 前一帧正在读取。这意味着它必须与 Fence 同步。这意味着前一帧不再被视为“飞行中”。

  • 我理解这一点,我不明白的是为什么它是每个交换链图像的资源而不是飞行中的每个帧的资源。如果我的交换链有 3 个图像,并且我希望同时运行最多 2 个帧,我是否可以只使用双缓冲区,以便帧 #1 渲染,然后帧 #2 渲染,帧 #3 等待帧 #1 和使用相同的资源? (2认同)
  • @RhuMage 您最好询问本教程的作者,但我认为因为这需要重新录制缓冲区。resource-per-simage 允许在设置时预烘焙 cmdbuffers 并且永远不会更改。 (2认同)