gpt4 book ai didi

iphone - OpenGL ES 不会删除我在内存中的纹理

转载 作者:可可西里 更新时间:2023-11-01 03:37:56 34 4
gpt4 key购买 nike

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

我的主图集相对较大 (2000x2000),但我的内部算法加载纹理并将其调整为 2048x2048,因为 OpenGL ES 仅接受 2 倍大小纹理的幂。我可以绘制瓷砖,这边一切都很好。

每次尝试加载和卸载(销毁)纹理时,我都会面临严重的内存泄漏。这应该在最终版本中发生,但我需要确保我的加载和卸载都很好。在内存中,纹理占用 2048x2048x4 (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 之后)。

有人有想法吗?谢谢!

最佳答案

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

关于iphone - OpenGL ES 不会删除我在内存中的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10247134/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com