图形 - 多次缓冲:排队还是上次完成?

时间:2016-07-21 22:45:54

标签: opengl graphics directx

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

时间轴:

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

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

    如果可能的话,我很乐意看到文档。我只是不知道语义定义的级别。

1 个答案:

答案 0 :(得分:1)

语义未定义。至少,不是在OpenGL中,即使使用wgl/glX_EXT_swap_control。交换间隔将让您决定交换是否等待vsyncs,但如果您在vsyncs之间交换多次,它的实现定义了哪个图像显示。

wgl/glX_EXT_swap_control_tear允许您指定如果您在交换缓冲区时遇到撕裂行为。但是,如果你没有说明,那么会发生什么。

Vulkan允许实现不同类型的"交换"通过其现有模式的功能。 FIFO是唯一需要的演示模式,意味着您呈现的每个图像都将按照提供的顺序显示。这意味着如果你试图"交换" (用Vulkan的说法,获取)下一张图像,两者都在等待呈现,然后GPU就会失速。

有些模式可以立即显示给定的图像,这是一种镜像" swap_control_tear"的模式,以及一种在您的情况下有用的模式,如果您尝试渲染缓冲区的速度超过它们可以呈现的速度等待的人将被丢弃以支持下一张图片。