Можно ли проверить, действительно ли текстура OpenGL ES на iPhone была действительно освобождена? - PullRequest
1 голос
/ 14 сентября 2009

В инструкции только что написано:

glDeleteTextures(1, &GLtexture);

и утверждает, что текстура будет удалена. У iPhone недостаточно памяти, и я хочу убедиться, что эти текстуры действительно выпущены.

Прибор Leaks не может обнаружить это, и, честно говоря, я немного обеспокоен. Я действительно хочу убедиться, что текстуры действительно исчезли.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 15 сентября 2009

Текстуры не обрабатываются средой выполнения Obj-c, поэтому утечки ничего о них не знают. Вы должны использовать другой инструмент.

В Xcode запустите новый проект, используя шаблон OpenGL. Найдите метод, который обновляет / рисует сцену и добавьте этот код в конец:

static int tick = -1;
static GLuint tex[5];

if (tick++ < 0)
    for (int f = 0; f < 5; f++)
        tex[f] = 0;

tick = tick % 5;
if (tex[tick]) {
    glDeleteTextures(1, &tex[tick]);
    tex[tick] = 0;
} else {
    glGenTextures(1, &tex[tick]);
    glBindTexture(GL_TEXTURE_2D, tex[tick]);
    char *mem = malloc(1024 * 1024 * 4);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
        1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, mem);
    free(mem);
}

Код генерирует и уничтожает пять текстур с помощью команд OpenGL. Создайте его и запустите один раз на вашем устройстве, чтобы убедиться, что оно установлено. Не беспокойся о пыхтении.

Теперь откройте инструменты и начните с пустого шаблона для iPhone. Откройте библиотеку и перетащите монитор памяти в окно. Нажмите на кнопку раскрытия информации и снимите все, кроме «Свободной физической памяти». Теперь выберите, чтобы запустить двоичный файл на вашем iPhone, чтобы начать запись. Вы должны увидеть, как лестница идет вверх / вниз в зависимости от того, когда Instruments пытается выполнить выборку приложения. Во время работы программы вы можете увидеть все активные процессы в столбце «Реальная память», показывающем фактическое использование памяти.

В моих тестах этот пример потребляет от 25 МБ до 3 МБ в зависимости от момента выборки памяти. Это с iPhone второго поколения и SDK 3.1. Если у вас есть 2.x SDK, вы должны искать размер резидентного объекта GART на обычном мониторе OpenGL. Подробнее см. http://blog.zincroe.com/2009/04/how-to-check-iphone-texture-memory-usage-with-instruments/.

В любом случае, перепрыгивание памяти вверх и вниз доказывает, что glDeleteTexture () работает так, как объявлено.

0 голосов
/ 14 сентября 2009

Обернуть вызовы к glDeleteTextures(int, int*) в вашей собственной функции, которая поддерживает таблицу распределения.

...