我一个2D游戏,有可以加载,多层次的工作(而且应该被卸载。)的OpenGL glDeleteTextures C/C++
为了更容易处理的纹理我写了,有一个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,我不认为数组删除会起作用 - 但我可能在这里是错误的。另外,请确保在调用delete时纹理未被绑定。绑定的纹理不会释放。 –
至于堆栈溢出,你可能会发布一个调用堆栈。 – Pete
我不知道如何解除纹理,我试过glDisable(GL_TEXTURE_2D),但它没有帮助。如果我无法删除单独删除的ID,我该如何解决该问题? – Orujimaru