首页 > 解决方案 > 使用 vsync 的交换缓冲区是否保证同步?

问题描述

我想知道我是否可以假设所有与缓冲区相关的 GPU 操作,例如:

假设 vsync 开启,则保证在执行交换缓冲区(即帧完成)后完成。

我很困惑,因为我遇到了诸如 rond robin vbo 之类的顶点流技术的实现,这意味着在下一帧中仍然可以使用 vbo。

我基本上想要做的是通过带有 GL_UNSYNCHRONIZED_BIT 的 glMapBufferRange 流式传输顶点,自己管理正确的范围,以便写入和读取永远不会重叠。如果我可以假设同步并在帧结束时重置流范围索引,这将非常有效。

换句话说,带 vsync 的交换缓冲区是否保证同步?

标签: opengl

解决方案


glDrawElements glBufferData glSubBufferData glUnmapBuffer 保证在执行交换缓冲区(即帧完成)后完成,假设 vsync 已打开。

不; 这对性能来说是很糟糕的。这基本上会强制执行完整的 GPU/CPU 同步,只是因为有人想要显示新图像。即使该图像的生成及其显示都是 GPU 进程(或者至少,不一定与您的 CPU 线程/进程同步)。

垂直同步的目的是确保新图像在垂直同步周期之前不会被交换,以避免图像的视觉撕裂,其中一半来自旧的,一半来自新的。这并不是要确保与 CPU 执行相关的任何事情都在 GPU 上实际完成。

如果您通过持久映射将数据流式传输到缓冲区对象(这应该优于旧的“非同步”恶作剧),那么您需要自己执行同步。在您发出渲染命令后设置一个栅栏同步对象,该命令将使用您写入的缓冲区中的数据。然后,当需要再次尝试写入该缓冲区时,检查栅栏同步并等待它可用。如果渲染持续延迟,这也使您可以自由扩展您拥有的此类缓冲区的数量。


推荐阅读