Sri*_*ati 5 opengl buffer-objects
是否需要在删除之前取消绑定缓冲区对象?如果我将它绑定在VAO中并将其删除而不解除绑定(绑定到0),会发生什么?参考文献是否仍然存在?
public void dispose()
{
glBindVertexArray(0);
glDeleteVertexArrays(vaoID);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(vboVertID);
glDeleteBuffers(vboColID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDeleteBuffers(eboID);
}
Run Code Online (Sandbox Code Playgroud)
删除前取消绑定是好的还是坏的做法?
没有.
可能,但不是你当前的伪代码.
在删除之前,您唯一想要在GL中手动取消绑定资源的时间是在单独的上下文中绑定它.这是因为实际释放与GL资源相关联的存储器的标准之一是其引用计数为0.glDelete* (...)只有在将对象放入要释放的对象队列之前,才从当前上下文中取消绑定对象.
如果在当前未绑定的VAO 保存指向此缓冲区的指针时删除它,或者如果它绑定在与您调用的OpenGL上下文完全不同的OpenGL上下文glDelete* (...)中,则引用计数在完成之前不会达到0glDelete* (...).因此,在您实际取消绑定或销毁所有保留引用的VAO /渲染上下文之前,不会释放内存.您将有效地泄漏内存,直到您处理所有悬空引用.
简而言之,glDelete* (...)将始终从当前上下文中取消绑定资源并回收任何名称以立即重用,但是如果在解除绑定之后它将仅释放相关内存,引用计数为0.
在这种情况下,取消绑定是完全没必要的,因为您在调用的相同上下文中这样做glDeleteBuffers (...).此调用隐式取消绑定您要删除的对象,因此您正在做一些多余的事情.更重要的是,你已经在调用之前删除了你的VAO-- glDeleteBuffers (...)当删除了VAO时,它放弃了所有的指针,从而将引用计数减少到你的缓冲区.
| 归档时间: |
|
| 查看次数: |
3010 次 |
| 最近记录: |