2014-03-25 52 views
2

假设我调用glGenBuffers(或WebGL中的createBuffer),后来我失去了缓冲区名称。例如。它超出了范围,被垃圾收集,无论情况如何。对C编程进行类比,这看起来像是内存泄漏。实际上,有一块分配的内存(在GPU上)没有指向它的指针。我猜GPU不能垃圾收集内存,因为它不能自动推断出客户端应用程序已经完成。OpenGL VBOs会泄漏内存吗?

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

回答

5

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

另请注意,在每次拨打glBufferData后不需要拨打glDeleteBuffers,它会销毁之前与之绑定的任何数据。只需拨打glDeleteBuffers一次,当您不再使用缓冲区时。

+4

另请注意,'glDeleteBuffers(...)'不会立即删除缓冲区。如果它在多上下文环境中使用,并且缓冲区绑定在不同的上下文中,它将不会被删除,直到它被解除绑定。规则是,如果在调用'glDeleteBuffers(...)'后有一个引用计数为0,则可以释放数据存储。在正常情况下,取消绑定缓冲区对象来处理这个引用计数,但是'glDeleteBuffers(...)'只将缓冲区从调用上下文中解除绑定。 –

+0

请注意,即使不是所有的OpenGL实现都会从GPU /服务器内存中交换未使用的内存对象,所以在技术上,就OpenGL而言,实际上存在无限可用的内存。 GL_OUT_OF_MEMORY表示前面的请求没有内存可以分配。例如,如果请求的创建对象的大小超出了实现的最大工作集大小,则可以这样做。所以是的,最终这个过程将会在没有错误的情况下运行,但是对于大多数实现来说,这发生的时间远远晚于天真的预期。 – datenwolf