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