OpenGL glDeleteTextures C / C ++

时间:2012-08-27 13:49:27

标签: c++ opengl memory overflow

我正在使用一个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,其中包含指向我第一次绑定纹理时获得的纹理的指针。

我做错了什么?

2 个答案:

答案 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()时,副本不会被释放。