我有一个使用 PBO 在 cpu 和 gpu 之间传输数据的多线程 OpenGL 应用程序。
我已经合并了 PBO 的分配,但是,当池为空时,我的非 opengl 线程必须阻塞一段时间,直到 OpenGL 线程到达可以分配缓冲区的点(即完成渲染当前帧)。在我想避免的某些情况下,这种等待会导致一些滞后峰值。
是否可以在另一个线程上分配 PBO,然后由“主”OpenGL 线程使用?
是的,您可以在一个线程上创建可以在另一个线程上使用的对象。您需要一个新的 GL 上下文来执行此操作。
话虽如此,有两个担忧。
首先,这取决于您所说的“公益组织的分配”是什么意思。您永远不应该在帧的中间分配缓冲区对象。您应该预先分配所有需要的缓冲区。当需要使用它们时,您可以简单地使用您拥有的东西。
“分配”是指glBufferData
使用与以前不同的大小或驱动程序提示调用先前分配的缓冲区。或以任何方式使用glGenBuffers
和glDeleteBuffers
。这些都不应该在一个框架内发生。
其次,使缓冲区无效永远不会导致“滞后峰值”。glBufferData
通过“无效”,我的意思是使用相同的大小和使用提示重新分配缓冲区,或者glMapBufferRange
使用GL_INVALIDATE_BUFFER
位。您应该查看此页面以了解有关如何流式传输缓冲区对象数据的详细信息。如果您遇到问题,那么您可能在 NVIDIA 硬件上使用了错误的缓冲区对象提示(即:使用 STREAM)。