我有一个多线程的OpenGL应用程序,使用PBO在cpu和gpu之间进行数据传输。
我已经共享了PBO的分配,然而,当池为空时,我的非OpenGL线程必须阻塞一段时间,直到OpenGL线程达到可以分配缓冲区的点(即完成当前帧的渲染)。这种等待在某些情况下会导致一些延迟峰值,这是我想要避免的。
是否可以在另一个线程上分配PBO,然后由“主”OpenGL线程使用?
发布于 2012-01-25 09:17:47
可以,您可以在一个线程上创建对象,该对象可以在另一个线程上使用。您将需要一个新的GL上下文来执行此操作。
话虽如此,但有两个问题。
首先,这取决于你所说的“PBO分配”是什么意思。永远不应该在帧的中间分配buffer对象。你应该预先分配你需要的所有缓冲区。当使用它们的时候,你可以简单地使用你所拥有的。
通过“分配”,我的意思是使用与以前不同的大小或驱动程序提示在先前分配的缓冲区上调用glBufferData。或者以任何方式使用glGenBuffers和glDeleteBuffers。这两种情况都不应该发生在一个帧内。
其次,使缓冲区无效永远不会导致“延迟尖峰”。所谓“无效”,我的意思是使用相同的大小和用法提示使用glBufferData重新分配缓冲区,或者使用带有GL_INVALIDATE_BUFFER位的glMapBufferRange。您应该查看this page on how to stream buffer object data以了解详细信息。如果你遇到了问题,那么你可能是在NVIDIA硬件上使用了错误的buffer对象提示(即:使用STREAM)。
https://stackoverflow.com/questions/8996452
复制相似问题