【问题标题】:OpenGL glDeleteTextures C/C++OpenGL glDeleteTextures C/C++
【发布时间】:2012-08-27 13:49:27
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 如果您单独创建了所有纹理 ID,我认为数组删除不会起作用 - 但是我可能在这里错了。此外,请确保调用删除时纹理未绑定。绑定的纹理不会释放。
  • 至于你得到的堆栈溢出,也许发布一个调用堆栈。
  • 我不确定如何取消绑定纹理,我尝试了 glDisable(GL_TEXTURE_2D) 但没有帮助。如果我无法删除单独删除的 ID,我该如何解决?

标签: c++ opengl memory overflow


【解决方案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();

【讨论】:

  • 谢谢,但恐怕不增加 x 只是一个错字。我也尝试了您的解决方案,但它不起作用,也许 getImage() 没有返回正确的内存路径?
  • 也许添加一些调试代码来验证已创建的纹理 ID 和您正在销毁的 ID。
  • id 是指向内存的指针,对吧?所以只要我可以在游戏中使用图像,它应该是正确的值。但是,它是否必须是常量,因为 glDeleteTexture 要求 const 值?
  • @Orujimaru:不,纹理 ID 不是指针。您显然是这样认为的,也是从阅读您的原始问题中得出的。 OpenGL 对象名称/ID 只是数字,即数字句柄。而且它们的行为不像指针。
  • 只需尝试调试跟踪您从 glGenTextures 获得的值以及您传递给 glDeleteTextures 的值,并验证您从 glGenTextures 获得的所有值是否都正确传递给 glDeleteTextures。跨度>
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多