VAO 删除会导致奇怪的内存问题

VAO deleting causes strange memory problems

提问人:ibe 提问时间:5/1/2016 更新时间:5/1/2016 访问量:212

问:

我有一个渲染周期,如下所示:导入模型 - >绘制它(一些帧...) - >删除它。为了绘制模型,我使用 vao/vbo/ebo。

现在,在包含以下代码的删除阶段:

glDeleteVertexArrays(1, &vao); glDeleteBuffers(1, &vbo); glDeleteBuffers(1, &ebo);

在 Xcode Allocation 工具中进行分析时,我得到了这个enter image description here

而如果代码写成这样: glDeleteBuffers(1, &vbo); glDeleteBuffers(1, &ebo); glDeleteVertexArrays(1, &vao);

突然它显示:

enter image description here

为什么会这样?我只改变了 / 的顺序,并得到了这个奇怪的“内存泄漏”。所有这 3 行代码都放置在 dctor 中,并且不会分布在整个应用程序中。glDeleteVAOglDeleteBuffers

此外,在删除 vbo、vao 和 ebo 后,在所有这些情况下,在所有缓冲区上都返回 0。glIsBuffer()

在 OS X El Capitan 上使用 OpenGL 4.1

C++ OpenGL 内存泄漏

评论

0赞 5/1/2016
我相信 OpenGL 实际上不会删除某些内容,直到使用它的所有内容都被解除绑定和删除。您是否尝试过先显式解除所有这些的绑定(通过将相应的部分绑定到 )?我怀疑它也可以自行决定清理它。我不记得标准太明确了。0
0赞 ibe 5/1/2016
@WilliamKappler我已经解除了所有缓冲区的绑定。OpenGL 实际上在引用计数达到零后释放内存。但是,更改呼叫顺序如何帮助呢?
0赞 5/1/2016
好吧,如果它真的这样做了,调用顺序不应该改变行为。但 OpenGL 实现是出了名的敏感。您可能希望在其他系统(或仅其他驱动程序)上运行测试,并查看结果是否不同。
0赞 derhass 5/1/2016
@ibe:“我已经解除了所有缓冲区的绑定”到底是什么意思?如果 VAO(不是缓冲区)仍然被绑定,则该行为是完全可以理解的。但即使没有,GL 实现基本上也可以无限期地延迟释放,并且它可能会在以后重用资源,而不是将其返回给操作系统。
0赞 Reto Koradi 5/1/2016
@derhass VAO 在被调用时会自动解除绑定。无论如何,这里更确定的测试是重复执行代码序列,并查看内存使用量是否不断增加。如果是这样,则可能是 OpenGL 实现中的一个错误。glDeleteVertexArrays()

答: 暂无答案