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

Opengl 图形-多重缓冲:排队还是上次完成?,opengl,graphics,directx,Opengl,Graphics,Directx,假设GPU有多个要渲染的后台缓冲区 时间线: 前缓冲区中的第0帧 屏幕刷新-屏幕上的第0帧 运行游戏循环,将第1帧的所有渲染命令提交到GPU 运行游戏循环,将第2帧的所有渲染命令提交到GPU GPU处理帧1的所有命令,并将帧1渲染到后缓冲区1中 GPU处理第2帧的所有命令,并将第2帧渲染到后面 缓冲区2 屏幕刷新-帧?银幕上 想法: 在GPU被告知不要等待VSYNC的情况下,我猜有一个5(b)和一个6(b),GPU将刚刚完成的后缓冲区复制到前缓冲区中。在这种情况下,将显示第2帧 如果GPU被告

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

时间线:

  • 前缓冲区中的第0帧
  • 屏幕刷新-屏幕上的第0帧
  • 运行游戏循环,将第1帧的所有渲染命令提交到GPU
  • 运行游戏循环,将第2帧的所有渲染命令提交到GPU
  • GPU处理帧1的所有命令,并将帧1渲染到后缓冲区1中
  • GPU处理第2帧的所有命令,并将第2帧渲染到后面 缓冲区2
  • 屏幕刷新-帧?银幕上
  • 想法:

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

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

    语义没有定义。至少,不在OpenGL中,即使使用。交换间隔将让您决定交换是否等待VSync,但如果您在VSync之间交换多次,则将由实现定义显示哪个图像

    允许您指定在交换缓冲区延迟时要删除的行为。但是,如果你早到了,会发生什么事情还没有说明

    Vulkan允许通过其当前模式实现不同类型的“交换”功能。FIFO是唯一需要的显示模式,这意味着您显示的每个图像都将按提供的顺序显示。这意味着,如果你试图“交换”(用Vulkan的说法,获取)下一个图像,而这两个图像都在等待显示,那么GPU将暂停

    有些模式可以立即显示给定的图像,有些模式可以镜像“swap_control_tear”,有些模式在您的情况下非常有用,如果您尝试以比显示缓冲区更快的速度渲染缓冲区,等待的缓冲区将被丢弃,取而代之的是下一个图像