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

Posted

技术标签:

【中文标题】图形 - 多重缓冲:排队或最后完成?【英文标题】:Graphics - Multiple Buffering: Queued or last completed? 【发布时间】:2016-07-21 22:45:54 【问题描述】:

假设 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 在缓冲区完成后不会交换缓冲区。但是,当 到了交换缓冲区的时候,我不知道它会选择什么缓冲区。

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

【问题讨论】:

【参考方案1】:

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

wgl/glX_EXT_swap_control_tear 允许你指定你想要的撕裂行为,如果你迟到了交换缓冲区。但是没有说明如果你早了会发生什么。

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

有一些模式可以立即呈现给定图像,一种反映“swap_control_tear”的模式,以及一种对您的情况有用的模式,如果您尝试渲染缓冲区的速度超过它们可以呈现的速度,那么等待的是丢弃以支持下一张图像。

【讨论】:

以上是关于图形 - 多重缓冲:排队或最后完成?的主要内容,如果未能解决你的问题,请参考以下文章

超出最小未排队缓冲区计数

音频队列播放完成的准确时间

用于多线程的 NAudio:缓冲区已在播放错误时排队

帧缓存的详细介绍

丢弃用于 TCP 连接的 winsock 内部缓冲区中的排队数据

将OpenGL帧缓冲区对象与Qt(QOpenGLWidget)一起使用,绘制到帧缓冲区时如何禁用多重采样