2012-08-27 40 views
0

我一个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,它带有一个指向我在第一次绑定纹理时获得的纹理的指针。

我在做什么错?

+0

如果你单独创建了所有的纹理ID,我不认为数组删除会起作用 - 但我可能在这里是错误的。另外,请确保在调用delete时纹理未被绑定。绑定的纹理不会释放。 –

+0

至于堆栈溢出,你可能会发布一个调用堆栈。 – Pete

+0

我不知道如何解除纹理,我试过glDisable(GL_TEXTURE_2D),但它没有帮助。如果我无法删除单独删除的ID,我该如何解决该问题? – Orujimaru

回答

1

您不会递增'x'。

此外,你泄漏数组的内存。为什么不使用矢量?

std::vector<GLuint> arr; 
arr.reserve(textures.size()); 
for (std::list<Texture2D*>::iterator it = textures.begin(); it != textures.end(); ++it) 
{ 
    arr.push_back((*it)->getImage()); 

    // Are you missing: 
    // delete *it; 
} 
if (!arr.empty()) { 
    glDeleteTextures(arr.size(), &arr[0]); 
} 
textures.clear(); 
+0

谢谢,但恐怕不增加x只是一个错字。 我试过你的解决方案,它不工作,也许getImage()不会返回正确的路径到内存? – Orujimaru

+0

也许会添加一些调试代码来验证已创建的纹理ID以及您正在销毁的ID。 – Pete

+0

这个id是指向内存的指针,对吧?所以只要我可以在游戏中使用图像,它应该是正确的值。但是,它是否必须是常量,因为glDeleteTexture要求const值? – Orujimaru

0

监视我的显存的使用情况后,我可以看到VRAM被正确释放,所以这个问题是因为在系统RAM的OpenGL存储副本没有得到释放,当我打电话glDeleteTextures()。