Opengl 使用vsynch交换缓冲区是否保证同步?

Opengl 使用vsynch交换缓冲区是否保证同步?,opengl,Opengl,我想知道是否可以假设所有与缓冲区相关的GPU操作,例如: 微量元素 glBufferData glSubBufferData 格伦马布弗 假设vsync开启,则保证在执行交换缓冲区(即帧完成)后完成 我很困惑,因为我遇到了顶点流技术的实现,比如rond robin vbo,这意味着vbo可能在下一帧中仍在使用 我基本上想做的是用GL_UNSYNCHRONIZED_位通过glMapBufferRange流化顶点,自己管理正确的范围,这样写入和读取就不会重叠。如果我可以假设同步并在帧结束时重置流

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

  • 微量元素
  • glBufferData
  • glSubBufferData
  • 格伦马布弗
假设vsync开启,则保证在执行交换缓冲区(即帧完成)后完成

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

我基本上想做的是用GL_UNSYNCHRONIZED_位通过glMapBufferRange流化顶点,自己管理正确的范围,这样写入和读取就不会重叠。如果我可以假设同步并在帧结束时重置流范围索引,那么这将非常有效

换句话说,使用vsynch交换缓冲区是否保证同步

假定vsync处于启用状态,则GLDraweElements glBufferData glSubBufferData glUnmapBuffer保证在执行交换缓冲区(即帧完成)后完成

没有;这对表演来说太糟糕了。这基本上就是因为有人想显示一个新的图像而强制执行一个完整的GPU/CPU同步。即使图像的生成和显示都是GPU进程(或者至少不一定与CPU线程/进程同步)

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

如果您是通过持久映射将数据流式传输到缓冲区对象中(这应该比旧的“非同步化”骗局更好),那么您需要自己执行同步。在发出渲染命令后设置一个值,该命令将使用写入的缓冲区中的数据。然后,当再次尝试写入该缓冲区时,请检查围栏同步并等待其可用。如果渲染持续延迟,您还可以自由地扩展所拥有的此类缓冲区的数量

假定vsync处于启用状态,则GLDraweElements glBufferData glSubBufferData glUnmapBuffer保证在执行交换缓冲区(即帧完成)后完成

没有;这对表演来说太糟糕了。这基本上就是因为有人想显示一个新的图像而强制执行一个完整的GPU/CPU同步。即使图像的生成和显示都是GPU进程(或者至少不一定与CPU线程/进程同步)

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


如果您是通过持久映射将数据流式传输到缓冲区对象中(这应该比旧的“非同步化”骗局更好),那么您需要自己执行同步。在发出渲染命令后设置一个值,该命令将使用写入的缓冲区中的数据。然后,当再次尝试写入该缓冲区时,请检查围栏同步并等待其可用。如果渲染持续延迟,这也让您可以自由地扩展此类缓冲区的数量。

请注意:假设大多数用户硬件都像今天一样支持持久映射,安全吗?我找不到任何可靠的统计数据…@莱克:任何与此有关的数据。当然,用过时的驱动程序来支持硬件是一个棘手的问题,因为驱动程序的错误是无法修复的。遗憾的是,我刚刚发现我5年的笔记本电脑没有ARB_buffer_存储,它只支持opengl 4.3。我想我还是需要使用向后兼容的方式。。。。您认为可以使用手动围栏同步旧的GL_未同步_位吗?请注意:假设大多数用户硬件都像今天一样支持持久映射,安全吗?我找不到任何可靠的统计数据…@莱克:任何与此有关的数据。当然,用过时的驱动程序来支持硬件是一个棘手的问题,因为驱动程序的错误是无法修复的。遗憾的是,我刚刚发现我5年的笔记本电脑没有ARB_buffer_存储,它只支持opengl 4.3。我想我还是需要使用向后兼容的方式。。。。您认为可以使用手动围栏同步和旧的GL_未同步位吗?