OpenGL VBO可以泄漏内存吗?

rlk*_*024 2 opengl

假设我调用glGenBuffers(或WebGL中的createBuffer),后来我丢失了缓冲区名称.例如,它超出范围,是垃圾收集,无论情况如何.类似于C编程,这似乎是一个内存泄漏.实际上,有一块已分配的内存(在GPU上),没有指向它的指针.我猜测GPU不能垃圾收集那个内存,因为它不能自动推断出客户端应用程序是用它完成的.

首先,这确实是内存泄漏吗?其次,如果我在丢失缓冲区名称之前调用glDeleteBuffers(或WebGL中的deleteBuffer),是否会释放内存并避免泄漏?

Jaa*_*a-c 5

是的,这将导致内存泄漏.您必须调用glDeleteBuffers每个分配的缓冲区.如果你调用它,它会释放GPU上的数据并将绑定恢复为0.如果你不打电话,GPU最终会耗尽内存而你的驱动程序可能会崩溃.

另请注意,glDeleteBuffers每次调用后都不需要调用glBufferData,它会销毁以前绑定到它的所有数据.glDeleteBuffers当你不再使用缓冲区时,只调用一次.

  • 另请注意,`glDeleteBuffers(...)`不会立即删除缓冲区.如果它在多上下文设置中使用,并且缓冲区绑定在不同的上下文中,则在它未绑定之前不会被删除.规则是如果在调用`glDeleteBuffers(...)`之后引用计数为0,则可以释放数据存储.在正常情况下,取消绑定缓冲区对象会处理这个引用计数,但是`glDeleteBuffers(...)`只能从调用上下文中取消绑定缓冲区. (5认同)