私は現在、OpenGL ES 1.0を使用していくつかの基本的なテクスチャをレンダリングするiOSアプリケーション(iPadおよびiPhone)を開発しています。私はアトラスを使用してテクスチャを保存および表示します。
私のメインアトラスは比較的大きい(2000x2000)が、OpenGL ESは2サイズのテクスチャのパワーしか受け入れないため、内部アルゴリズムはテクスチャをロードして2048x2048にサイズ変更します。私はタイルを描くことができます、こちら側はすべて問題ありません。
テクスチャをロードおよびアンロード(破棄)しようとするたびに、深刻なメモリリークが発生します。これは最終バージョンで発生するはずですが、ロードとアンロードが正常であることを確認する必要がありました。メモリ内では、テクスチャは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()を使用しましたが、(glDeleteTextureの後でも)常に0を返します。
誰かアイデアがありますか?ありがとうございました!