glGenBuffers - 释放内存?

Posted

技术标签:

【中文标题】glGenBuffers - 释放内存?【英文标题】:glGenBuffers - freeing memory? 【发布时间】:2012-07-20 14:01:34 【问题描述】:

当我使用 glGenBuffers 创建一个带有指向它的 VBO 时,我(认为)正在分配内存。对 glGenBuffers 的后续调用应该返回不同的指针,但是之前分配的内存呢?在 Nehe 示例中,我没有看到“空闲内存”调用......并且我读到 openGL 是一种“状态机”,这是否意味着如果我的 initializeBuffers() 函数被多次调用,我不会需要释放任何东西并“按原样”使用 glGenBuffers 吗?

【问题讨论】:

请注意,您从glGenBuffers 返回的是一组“名称”(一些未指定的整数,如“句柄”),而不是指针。理论上这可能是连续递增的数字,OpenGL 只记住它给出的最后一个数字(尽管实际上它可能还会在内部分配一些结构)。 感谢您指出这一点,理论上,如果我在不释放它们的情况下不断增加它们,数字可能会溢出,对吧? 好吧,如果驱动程序实现是非常天真的并且您实际上分配了超过 40 亿个缓冲区,是的...但是 32 位应用程序将用完所需的地址空间更早地保存这些数字,并且 64 位应用程序需要 16GB 的虚拟内存来存储它们,所以...这不是可能出现的问题之一 :-) 我想知道为什么在数据存储在 2 个位置(系统内存和 GPU 中)时使用 VBO 是有利的。 【参考方案1】:

对于您拨打的任何glGenBuffers 电话,您必须拨打相应的glDeleteBuffers 电话。

请注意,您传递给glGenBuffers 的指针未分配/解除分配。事实上,甚至可能这些调用实际上并没有在 cpu 内存中分配任何东西,但你也不能保证这一点。

您传递给glGenBuffers 的是一个已分配的数组(或单个值),它将存储您引用 gpu 资源的“名称”,工作流程如下所示:

GLuint buffer; //Note: statically allocated
glGenBuffers(1, &buffer); // Allocate a GPU-resource - only updates value in buffer
//Work a bit with buffer
glDeleteBuffers(1, &buffer); //Deallocate the gpu-resource

buffer 作为指针传递的原因是因为您可以创建多个缓冲区,例如像这样:

GLuint buffer[3]; //Note: again statically allocated
glGenBuffers(3, &buffer); // Allocate a GPU-resource - update values in buffer
//Work a bit with buffer
glDeleteBuffers(3, &buffer); //Deallocate the gpu-resource

当然,buffer 也可以由您动态分配,例如:

std::vector<GLuint> buffer(3); //std::vector uses dynamic allocation
glGenBuffers(3, &buffer[0]); // Allocate a GPU-resource - update values in buffer
//Work a bit with buffer
glDeleteBuffers(3, &buffer[0]); //Deallocate the gpu-resource

【讨论】:

以上是关于glGenBuffers - 释放内存?的主要内容,如果未能解决你的问题,请参考以下文章

如何手动释放Linux内存?

linux何时自动释放内存

为啥有时会立即释放内存,而有时仅在自动释放池耗尽时才释放内存?

如何手动释放Linux内存的方法

sql 2008 R2 怎样 释放内存

linux采用啥方法实现内存的分配和释放