【发布时间】:2015-02-20 16:40:23
【问题描述】:
我正在使用我编写的类加载纹理,如下所示。目的是创建一个新纹理,用存储在数组中的数据加载它,然后将其渲染到屏幕上。纹理创建没有任何问题,并且也被加载。但是,尽管调用 delete 以调用 Texture 类的析构函数来删除纹理,但它会导致应用程序内存大小不断增加的内存泄漏。
void renderCurrentGrid(){
// Get the current grid (custom wrapper class, it's working fine)
Array2D<real_t> currentGrid = m_Continuum->getCurrentGrid();
// load it as a texture
Texture *currentGridTexture = new Texture(GL_TEXTURE_2D);
currentGridTexture->load(currentGrid.sizeWd(), currentGrid.sizeHt(), ¤tGrid(0,0));
......
delete currentGridTexture;
}
纹理类的加载函数:
bool Texture::load(const size_t width, const size_t height, const float *data)
{
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// Allocate a texture name
glGenTextures(1, &m_TextureObj);
// select current texture
glBindTexture(GL_TEXTURE_2D, m_TextureObj);
// select replace to ensure texture retains each texel's colour
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// if texture wraps over at the edges
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,/* &density(0,0)*/data);
m_Loaded = true;
return true;
}
以及Texture类的析构函数:
Texture::~Texture()
{
glBindTexture(m_TextureTarget, m_TextureObj);
glDeleteTextures(1, &m_TextureObj);
glBindTexture(m_TextureTarget, NULL);
}
纹理类的私有数据成员:
private:
GLenum m_TextureTarget;
GLuint m_TextureObj;
bool m_Loaded;
在这里,我创建了新纹理,并使用纹理类的加载函数加载它。纹理渲染得非常好,但加载会导致内存泄漏。当我在任务管理器上检查时,应用程序内存大小不断增加。
但是,当我注释掉该行时
currentGridTexture->load(....);
内存泄漏停止。我省略了渲染功能,与问题无关。
【问题讨论】:
-
glDeleteTexture释放 GPU 资源,您似乎正在泄漏 CPU 内存,这是一个完全不同的问题。 -
好点,它是 CPU,我应该在哪里寻找内存泄漏,因为我现在很难过,因为内存泄漏发生在纹理类?
-
无关,但值得注意的是:
glGenerateMipmap (...)相对于glTexImage2D (...)的调用顺序错误。您需要调用 after 将图像上传到纹理 LOD 0 - 否则,没有图像可以从中生成较低分辨率的 mipmap LOD . 现在没关系,因为你没有使用 mipmap 缩小过滤器,但如果你改变它,它会的。 -
感谢您指出这一点,@Andon。我在生成 mipmap 时遇到了问题,这就是我使用
GL_NEAREST参数的原因。尽管我在下面的解决方案允许在第二次渲染调用期间生成 mipmap,但这是一个我不会发现的细微差别。切换顺序解决了它。
标签: c++ opengl memory memory-leaks textures