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