0

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

我究竟做错了什么?

4

2 回答 2

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();
于 2012-08-27T14:03:55.243 回答
0

在监视我的 Vram 使用情况后,我可以看到 Vram 正在被正确释放,所以问题是因为 OpenGL 将副本存储在系统 RAM 中,当我调用 glDeleteTextures() 时这些副本没有被释放。

于 2012-08-28T09:16:21.540 回答