我目前正在开发一个iOS应用程序(iPad和iPhone),使用OpenGL ES 1.0来渲染一些基本的纹理。我使用贴图集来存储和呈现我的纹理。
我的主要贴图集比较大(2000×2000),但是我的内部算法会将纹理加载和调整大小到2048×2048,因为OpenGL ES只接受2的幂次方大小的纹理。我能够绘制瓷砖,这方面都很好。
每当我尝试加载和卸载(销毁)纹理时,我都会遇到严重的内存泄漏问题。这在最终版本中应该会发生,但我需要确保我的加载和卸载没有问题。在内存中,纹理占用2048×2048×4(RGBA)字节=约16MB。这是一个巨大的字节数,所以你可以理解我的问题非常烦人(iOS在几分钟后就会杀死应用程序..)
当我加载纹理时,Instruments会指示应用程序使用的总内存增加了16MB,这是正确的(我使用“真实内存”列)。问题出现在我需要销毁纹理以释放所有可能使用的字节时:它从未释放这16MB...而且由于我在循环中加载和卸载,内存仍然在被使用,从未被释放。
以下是我如何加载纹理的方式:
我的主要贴图集比较大(2000×2000),但是我的内部算法会将纹理加载和调整大小到2048×2048,因为OpenGL ES只接受2的幂次方大小的纹理。我能够绘制瓷砖,这方面都很好。
每当我尝试加载和卸载(销毁)纹理时,我都会遇到严重的内存泄漏问题。这在最终版本中应该会发生,但我需要确保我的加载和卸载没有问题。在内存中,纹理占用2048×2048×4(RGBA)字节=约16MB。这是一个巨大的字节数,所以你可以理解我的问题非常烦人(iOS在几分钟后就会杀死应用程序..)
当我加载纹理时,Instruments会指示应用程序使用的总内存增加了16MB,这是正确的(我使用“真实内存”列)。问题出现在我需要销毁纹理以释放所有可能使用的字节时:它从未释放这16MB...而且由于我在循环中加载和卸载,内存仍然在被使用,从未被释放。
以下是我如何加载纹理的方式:
GLubyte *outData = malloc((_dataWidth * _dataHeight * 4) * sizeof(*outData));
GLuint _texture; // declared as un instance variable so its address never changes
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _dataWidth, _dataHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, outData);
free(outData);
以下是我卸载纹理的方法(这就是它被称为的方式,我已经检查过了)
glDeleteTextures(1, &_texture);
我在每个地方都使用了glGetError()来检查是否发生错误,但它总是返回0(即使在glDeleteTexture之后)。
有没有人有想法呢? 谢谢!