OpenGL ES не#39;не удаляет мою текстуру из памяти

В настоящее время я разрабатываю приложение для iOS (iPad и iPhone), которое использует OpenGL ES 1.0 для рендеринга некоторых базовых текстур. Я использую атласы для хранения и представления своих текстур.

Мой основной атлас относительно большой (2000x2000), но мои внутренние алгоритмы загружают и изменяют размер текстуры до 2048x2048, так как OpenGL ES принимает текстуры только мощности 2-х размеров. Я умею рисовать тайлы, с этой стороны все в порядке.

Я сталкиваюсь с серьезной утечкой памяти каждый раз, когда пытаюсь загрузить и выгрузить (уничтожить)текстуру. Это должно произойти в финальной версии, но мне нужно было убедиться, что моя загрузка и выгрузка прошли нормально. В памяти текстура занимает 2048x2048x4 (RGBA)байт = 16 МБ ок. Это огромное количество байтов, так что вы понимаете, что проблема меня очень раздражает. (iOS убивает приложение через несколько минут..)

Когда я загружаю текстуру, инструменты показывают, что общая память, используемая приложением увеличивается на 16 МБ, это верно (Я использую столбец «Реальная память»). Проблема возникает, когда мне нужно уничтожить текстуру, чтобы освободить все возможные используемые ею байты:, она никогда не теряет 16 МБ... и, поскольку я загружаю и выгружаю в цикле, память продолжает использоваться и никогда не освобождается.

Вот как я загружаю текстуры:

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).

У кого-нибудь есть идеи? Спасибо!

6
задан Nicolas B. 20 April 2012 в 13:23
поделиться