【发布时间】:2012-08-27 13:49:27
【问题描述】:
我正在开发一个 2D 游戏,它有多个可以加载和(并且应该被卸载)的关卡。
为了更容易处理纹理,我编写了一个 TextureLoader 类,它有一个包含所有纹理的列表,当游戏中的一个对象想要使用一个纹理时,它只有它希望使用的纹理的路径,然后询问TextureLoader 是否可以获得指向具有相同路径的纹理的指针。然后,如果纹理不存在于列表中,TextureLoader 将在返回指针之前尝试加载它。
这在整个游戏中运行良好,当我重新加载关卡时,内存使用量保持不变。
但是当我加载一个新关卡时,我显然希望卸载之前的关卡,但它似乎不起作用。
这就是 glDeleteTextures 的用武之地。
所以我尝试做的是:
int arraySize = textures.size();
GLuint* arr = new GLuint[arraySize];
int x = 0;
for (std::list<Texture2D*>::iterator it = textures.begin(); it != textures.end(); ++it)
{
arr[x] = (*it)->getImage();
x++;
}
glDeleteTextures(arraySize, arr);
textures.clear();
由于指向内存的指针存储在单独的 Texture2D 类中,因此我尝试在调用 glDeleteTextures 之前收集所有指针;
但是,我的内存使用量在每个级别都在不断增长,直到达到堆栈溢出。
getImage()
返回一个 GLuint,并带有一个指向我第一次绑定纹理时获得的纹理的指针。
我做错了什么?
【问题讨论】:
-
如果您单独创建了所有纹理 ID,我认为数组删除不会起作用 - 但是我可能在这里错了。此外,请确保调用删除时纹理未绑定。绑定的纹理不会释放。
-
至于你得到的堆栈溢出,也许发布一个调用堆栈。
-
我不确定如何取消绑定纹理,我尝试了 glDisable(GL_TEXTURE_2D) 但没有帮助。如果我无法删除单独删除的 ID,我该如何解决?
标签: c++ opengl memory overflow