OpenGL VBO 会泄漏内存吗?

Posted

技术标签:

【中文标题】OpenGL VBO 会泄漏内存吗?【英文标题】:Can OpenGL VBOs leak memory? 【发布时间】:2014-03-25 22:59:14 【问题描述】:

假设我调用 glGenBuffers(或 WebGL 中的 createBuffer),然后我丢失了缓冲区名称。例如。它超出了范围,被垃圾收集,不管是什么情况。类比 C 编程,这似乎是内存泄漏。实际上,有一块分配的内存(在 GPU 上)没有指向它的指针。我猜 GPU 无法垃圾收集该内存,因为它无法自动推断客户端应用程序已使用它。

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

【问题讨论】:

【参考方案1】:

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

另外请注意,您无需在每次调用glBufferData 后调用glDeleteBuffers,它会破坏之前绑定的所有数据。当您不再使用缓冲区时,只调用一次glDeleteBuffers

【讨论】:

还要注意glDeleteBuffers (...) 不会立即删除缓冲区。如果它在多上下文设置中使用,并且缓冲区被绑定在不同的上下文中,它将不会被删除,直到它在那里解除绑定。规则是,如果在调用glDeleteBuffers (...) 后引用计数为 0,则可以释放数据存储。在正常情况下,解除绑定缓冲区对象会处理这个引用计数,但glDeleteBuffers (...) 只会解除缓冲区与调用上下文的绑定。 请注意,许多(如果不是全部)OpenGL 实现会将未使用的内存对象从 GPU/服务器内存中交换出来,因此从技术上讲,就 OpenGL 而言,可用内存几乎是无限的。 GL_OUT_OF_MEMORY 表示不能为前一个请求分配内存。例如,如果请求的对象创建的大小超过了实现的最大工作集大小。所以是的,最终该过程将在错误情况下运行,但在大多数实现中,这发生的时间远远晚于天真的预期。 泄露的内存什么时候恢复?应用退出时,系统重启时...?

以上是关于OpenGL VBO 会泄漏内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 会使用多个 VBO 减慢渲染速度吗?

共享内存架构中的 OpenGL (ES 2.0) VBO 性能

opengl vbo 纹理

c ++ Opengl,Win内存泄漏

OpenGL ES VBO 奇怪的内存影响

初识OpenGL VBO顶点缓冲对象