我正在使用 PBO 在我的 cpu 和 gpu 之间异步移动数据。
当从 GPU 移动时,我知道在 PBO 上调用 glMapBuffer 后我可以删除源纹理。
但是,反过来呢?我什么时候知道从 PBO 到纹理 (glTexSubImage2D(..., NULL)) 的传输已经完成并且我可以安全地释放或重新使用 PBO?是在我绑定(bind)纹理后还是其他什么时候?
最佳答案
我认为在调用 glTexImage
之后,您可以安全地删除或重新使用缓冲区而不会出错,因为驱动程序会为您处理所有事情,包括延迟销毁(这是缓冲区对象的优势)。但这意味着,对 glMapBuffer
的调用可能会阻塞,直到前面的 glTexImage
复制完成。如果您想重用缓冲区并覆盖其全部内容,通常的做法是在调用 glMapBuffer
之前使用 glBufferData
重新分配它。通过这种方式,驱动程序知道您不再关心以前的内容,并且可以分配一个您可以立即使用的新缓冲区(包含以前内容的内存在真正不再使用时由驱动程序释放)。请记住,您的缓冲区对象只是内存的句柄,驱动程序可以随意管理和复制它。
编辑: 这意味着您可以在 glGetTexImage
返回后以另一种方式 (GPU-CPU) 删除源纹理,因为驱动程序在幕后管理一切。使用或不使用缓冲区对象的决定不应该对您调用 GL 函数的顺序和时间有任何影响。请记住,调用 glDelete...
不会立即删除对象,它只是将此命令排入 GL 命令流,即便如此,在真正释放任何内存时由驱动程序决定。
关于c++ - 我什么时候可以发布源 PBO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6132510/