如何释放glBufferData内存

sgt*_*ale 3 c++ opengl ios

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

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

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

Ret*_*adi 6

您不能通过重复调用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()是最佳选择.