OpenGL ES не удалит мою текстуру в памяти
в настоящее время я разрабатываю приложение iOS (iPad и iPhone), которое использует OpenGL ES 1.0 для рендеринга некоторых основных текстур. Я использую атласы для хранения и представления своих текстур.
мой основной атлас относительно большой (2000x2000), но мои внутренние алгоритмы загружают и изменяют размер текстуры до 2048x2048, так как OpenGL ES принимает только мощность текстур 2 размера. Я умею рисовать плитки, с этой стороны все в порядке.
Я серьезная утечка памяти каждый раз, когда я пытаюсь загрузить и разгрузить (уничтожить) текстуру. Это должно произойти в окончательной версии, но мне нужно было убедиться, что моя загрузка и разгрузка были в порядке. В памяти текстура занимает 2048x2048x4 (RGBA) байт = 16 МБ ок. Это огромное количество байтов, поэтому вы понимаете, что проблема довольно раздражает меня (iOS убивает приложение через несколько минут..)
когда я загружаю текстуру, инструменты указывают, что общая память, используемая приложением, увеличивается на 16 МБ это правильно (Я использую столбец "реальная память"). Проблема возникает, когда мне нужно уничтожить текстуру, чтобы освободить все возможные байты, используемые ею: она никогда не теряет 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).
у кого-нибудь есть идея? Спасибо!
2 ответов
убедитесь, что вы уничтожили текстуру в том же потоке, где вы создали свой контекст. Если вы делаете какие-либо вызовы GL без контекста, ошибок не будет.