假设我为统一缓冲区分配内存,如下所示:
GLuint length(0x1000);
GLuint myBuffer;
glGenBuffers(1, &myBuffer);
glBindBuffer(GL_UNIFORM_BUFFER, myBuffer);
glBufferData(GL_UNIFORM_BUFFER, length, NULL, GL_STATIC_DRAW);
当我使用缓冲区时,我想确保内存再次可用于其他缓冲区。是否足以呼吁glDeleteBuffers(1,&myBuffer)
实现这一目标?因为我的直觉告诉我应该有一个与glBufferData
对称的呼叫
(例如OpenGL 4中的glInvalidateBufferData
),但glBufferData
的文档中没有提到任何类型的内容(http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml)
答案 0 :(得分:6)
不是嗡嗡声杀戮,但像Vertex Array Objects这样的容器对象使这个讨论复杂化。
通常,当您删除缓冲区对象时,会发生两个允许回收内存的关键事项:
GLuint
ID)已被释放以便立即重复使用当您删除绑定到顶点数组对象的顶点缓冲区对象并且当前未绑定顶点数组对象时,不会发生项目符号第2点中讨论的行为。发生的是名称被释放,但VAO继续引用名称(现在无效)和数据存储(继续存在)。在删除此顶点数组对象或更改绑定以使其不再引用原始缓冲区对象之前,不会回收缓冲区对象的内存。
有关上述内容的更权威的解释,我建议您阅读OpenGL 4.4 core spec的第5.1.2节和第5.1.3节。我将列出以下两者中最相关的部分。
当删除缓冲区,纹理或渲染缓冲区对象时,它将从当前上下文中绑定的任何绑定点解除绑定,并与绑定到当前上下文的容器对象的任何附件分离,如DeleteBuffers,DeleteTextures和DeleteRenderbuffers。如果对象绑定与其他相关状态(例如BindBufferRange中的缓冲区范围或FramebufferTexture或BindImageTexture中的选定级别和层信息)建立,则该状态不受自动解除绑定的影响。其他情境中的绑定点不受影响。 未绑定容器对象的附件(例如删除附加到未绑定到上下文的顶点数组对象的缓冲区)不受影响,并继续充当已删除对象的引用,如以下部分。
[...] GL的基础存储支持已删除的对象将不会被回收,直到 所有引用 从容器对象附加点,上下文绑定点到对象或者删除视图。
注意:此行为适用于OpenGL中的所有容器对象,在消除对资源的所有引用之前,不会回收内存。熟悉必要条件(参见: 5.1.2 )以便删除参考资料,从长远来看,这将为您提供良好的服务。
答案 1 :(得分:2)
glDeleteBuffers
标记所选的缓冲区以进行删除和释放,只要OpenGL的任何部分不再需要内部缓冲区的数据,就会立即执行此操作。对于所有实际意义,glDeleteBuffers
释放缓冲区。