图形 - 多重缓冲:排队还是最后完成?

问题描述 投票:0回答:1

假设 GPU 有多个后台缓冲区可供渲染。

时间轴:

  1. 前端缓冲区中的帧 0
  2. 屏幕刷新 - 屏幕上第 0 帧
  3. 运行游戏循环,将第 1 帧的所有渲染命令提交到 GPU
  4. 运行游戏循环,将第 2 帧的所有渲染命令提交到 GPU
  5. GPU 处理第 1 帧的所有命令并将第 1 帧渲染到后缓冲区 1 中
  6. GPU 处理第 2 帧的所有命令并将第 2 帧渲染到 Back 缓冲器 2
  7. 屏幕刷新-框架?屏幕上

想法:

  • 在 GPU 被告知不要等待 VSYNC 时,我猜测有 5(b) 和 6(b),其中 GPU 将刚刚完成的后台缓冲区复制到前台缓冲区。在这种情况下,将显示第 2 帧。
  • 如果 GPU 被告知等待 VSYNC,则 GPU 在完成后不会交换缓冲区。但是,当确实需要交换缓冲区时,我不知道它选择什么缓冲区。

如果可能的话,我希望看到文档。我只是不知道语义是在什么级别定义的。

opengl graphics directx
1个回答
2
投票

语义未定义。至少,在 OpenGL 中,即使使用 wgl/glX_EXT_swap_control 也是如此。交换间隔将让您决定交换是否将等待垂直同步,但如果您在垂直同步之间交换多次,则由实现定义显示哪个图像。

wgl/glX_EXT_swap_control_tear 允许您指定在交换缓冲区较晚时需要撕裂行为。但没有说明如果你早到会发生什么。

Vulkan 允许实现通过其现有模式公开不同类型的“交换”功能。 FIFO 是唯一必需的呈现模式,意味着您呈现的每个图像都将按照提供的顺序呈现。这意味着如果您尝试“交换”(用 Vulkan 的话说,获取)下一张图像并且两者都在等待呈现,那么 GPU 将停止运行。

有一些模式可以立即呈现给定的图像,一种模式可以反映“swap_control_tear”,还有一种模式在您的情况下很有用,如果您尝试渲染缓冲区的速度快于呈现的速度,则等待的模式将被丢弃支持下一张图片。

© www.soinside.com 2019 - 2024. All rights reserved.