- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个多线程 OpenGL 应用程序,它使用 PBO 在 cpu 和 gpu 之间传输数据。
我已经合并了 PBO 的分配,但是,当池为空时,我的非 opengl 线程必须阻塞一段时间,直到 OpenGL 线程到达可以分配缓冲区的点(即完成渲染当前帧) .在我想避免的某些情况下,这种等待会导致一些滞后峰值。
是否可以在另一个线程上分配 PBO,然后由“主”OpenGL 线程使用?
最佳答案
是的,您可以在一个线程上创建可在另一个线程上使用的对象。您将需要一个新的 GL 上下文来执行此操作。
话虽这么说,但有两个问题。
首先,这取决于您所说的“PBO 的分配”是什么意思。您永远不应该在帧中间分配缓冲区对象。您应该预先分配所需的所有缓冲区。当需要使用它们时,您可以简单地使用现有的。
“分配”是指使用与之前不同的大小或驱动程序提示在先前分配的缓冲区上调用 glBufferData
。或者以任何方式使用 glGenBuffers
和 glDeleteBuffers
。这些都不应该发生在一个框架内。
其次,使缓冲区无效永远不会导致“滞后峰值”。通过“无效”,我的意思是使用相同的大小和用法提示使用 glBufferData
重新分配缓冲区,或者使用带有 GL_INVALIDATE_BUFFER
位的 glMapBufferRange
。你应该看看this page on how to stream buffer object data了解详情。如果您遇到问题,那么您可能使用了 NVIDIA 硬件并使用了错误的缓冲区对象提示(即:使用 STREAM)。
关于c++ - 在单独的线程上分配 PBO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8996452/
我是一名优秀的程序员,十分优秀!