繁体   English   中英

如何释放glBufferData内存

[英]How to deallocate glBufferData memory

我创建了一个顶点缓冲对象类来管理我的应用程序中的许多顶点。 用户调用构造函数来创建glBuffer并调用glBufferData来分配指定的空间量。

有一个名为resize的类函数,允许用户通过再次调用glBufferData来改变VBO的容量。 我的问题是, 我如何解除分配先前的分配? 还是自动完成?

根据opengl文档,glDeleteBuffer只删除缓冲区本身而不提及glBufferData分配的实际内存。 我可以继续在同一个绑定缓冲区上调用glBufferData而没有内存泄漏吗?

您不能通过为同一缓冲区对象重复调用glBufferData()来创建内存泄漏。 新的分配取代旧的分配。

有一个微妙的方面,大多数时候你不需要担心,但可能仍然有用的理解:有可能暂时对同一缓冲区对象进行多次活动分配。 这是因为OpenGL的异步特性。 为了说明,请像这样描绘一个呼叫序列:

  1. glBufferData(dataA)
  2. glDraw()
  3. glBufferData(dataB)
  4. glDraw()

当你按照这个顺序对第3项进行API调用时,GPU可能还没有完成来自调用2的绘制调用。它实际上可能仍然在驱动程序的某个地方排队,而不是已经移交给GPU。 由于呼叫2取决于dataA ,即数据不能被删除,直到GPU完成执行绘图调用2。在这种情况下,对于分配dataAdataB暂时同时存在的。

什么时候确实删除dataA取决于实现。 它不能早于GPU完成绘制调用2的时间。之后它可以立即,基于一些垃圾收集计时器,当内存不足时,或许多其他选项。

glDeleteBuffer()也会删除缓冲区内存。 与上述内容非常相似,可能不会立即发生。 同样,它只能在GPU完成执行所有使用缓冲存储器的挂起操作后删除。

如果您不打算再使用缓冲区对象,则调用glDeleteBuffer()是最佳选择。

10分钟后,我阅读了glBufferData页面的文档。

glBufferData为当前绑定到目标的缓冲区对象创建新的数据存储。 将删除任何预先存在的数据存储。

,这解决了我的问题。 我确实可以继续调用它来增加或减少我的VBO的大小。

glDeleteBuffer删除缓冲区句柄,系统很快就会收集/释放相关的资源(如果有的话)。

如果缓冲区当前已绑定,则驱动程序将解除绑定(绑定到零),尽管删除绑定缓冲区很难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM