图形 - 多重缓冲:排队或最后完成?
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”的模式,以及一种对您的情况有用的模式,如果您尝试渲染缓冲区的速度超过它们可以呈现的速度,那么等待的是丢弃以支持下一张图像。
【讨论】:
以上是关于图形 - 多重缓冲:排队或最后完成?的主要内容,如果未能解决你的问题,请参考以下文章