我正在使用一个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,其中包含指向我第一次绑定纹理时获得的纹理的指针。
我做错了什么?
答案 0 :(得分: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();
答案 1 :(得分:0)
在监视我的VRam使用后,我可以看到Vram正在被正确释放,所以问题是因为OpenGL将副本存储在系统RAM中,当我调用glDeleteTextures()时,副本不会被释放。