我创建了一个顶点缓冲区对象类来管理应用程序中的大量顶点。用户调用构造函数创建glBuffer,并调用glBufferData分配指定大小的空间。
有一个名为 resize 的类函数,允许用户通过再次调用 glBufferData 来更改 VBO 的容量。我的问题是,如何取消之前的分配?或者它是自动完成的吗?
根据 opengl 文档,glDeleteBuffers 只删除缓冲区本身,而没有提及用 glBufferData 分配的实际内存。我可以继续在同一个绑定缓冲区上调用 glBufferData 而不会出现内存泄漏吗?
重复调用不会造成内存泄漏glBufferData()
对于同一个缓冲区对象。新分配取代旧分配。
大多数时候您不需要担心一个微妙的方面,但理解它可能仍然有用:同一个缓冲区对象可能有多个活动分配暂时地。这是由于 OpenGL 的异步特性而发生的。为了便于说明,请想象一个如下的调用序列:
glBufferData(dataA)
glDraw()
glBufferData(dataB)
glDraw()
当您按此顺序对第 3 项进行 API 调用时,GPU 可能尚未完成调用 2 中的绘制调用。事实上,它可能仍在驱动程序中的某个位置排队,尚未移交给 GPU。由于调用 2 取决于dataA
,直到 GPU 完成执行绘制调用 2 后才能删除该数据。在这种情况下,分配dataA
and dataB
暂时同时存在。
具体什么时候dataA
实际上是否删除取决于实现。它只是不能早于 GPU 完成绘制调用 2 的时间。之后,根据某些垃圾收集计时器、内存不足或许多其他选项,它可能会立即完成。
glDeleteBuffer()
也将删除缓冲存储器。与上面的观点非常相似,它可能不会立即发生。同样,只有在 GPU 执行完所有使用缓冲存储器的挂起操作后才能将其删除。
如果您不打算再使用缓冲区对象,请调用glDeleteBuffer()
是最好的选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)