OpenGL ES不会删除内存中的纹理

Nic*_* B. 6 iphone textures memory-leaks opengl-es ios

我目前正在开发一个使用OpenGL ES 1.0渲染一些基本纹理的iOS应用程序(iPad和iPhone).我使用地图集来存储和呈现我的纹理.

我的主要图集相对较大(2000x2000)但我的内部算法加载并将纹理大小调整为2048x2048,因为OpenGL ES只接受2个大小纹理的功能.我能够画出瓷砖,这一切都很好.

每当我尝试加载和卸载(破坏)纹理时,我都会面临严重的内存泄漏.这应该发生在最终版本中,但我需要确保我的装载和卸载都很好.在内存中,纹理占用2048x2048x4(RGBA)字节=约16MB.这是一个巨大的字节数,所以你明白这个问题对我来说很烦人(几分钟后iOS就会杀死它.)

当我加载纹理时,Instruments表示应用程序使用的总内存增加了16MB,这是正确的(我使用"Real Memory"列).当我需要销毁纹理以释放它所使用的所有可能字节时,问题就出现了:它永远不会丢失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);
Run Code Online (Sandbox Code Playgroud)

这是我卸载纹理的方法(这个叫做,我查了一下)

glDeleteTextures(1, &_texture);
Run Code Online (Sandbox Code Playgroud)

我到处使用glGetError()来检查是否发生了错误,但它总是返回0(即使在glDeleteTexture之后).

有人有想法吗?谢谢!

Max*_*Max 14

确保在创建上下文的同一线程上销毁纹理.如果您在没有上下文的情况下进行任何GL调用,则不会出现错误.