Можно ли проверить, действительно ли текстура OpenGL ES на iPhone была действительно освобождена?

StackOverflow https://stackoverflow.com/questions/1420794

Вопрос

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

glDeleteTextures(1, &GLtexture);

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

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

Спасибо.

Это было полезно?

Решение

Текстуры не обрабатываются средой выполнения 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. Откройте библиотеку и перетащите монитор памяти в окно. Нажмите на кнопку раскрытия информации и снимите все, кроме «Physical Memory Free». Теперь выберите, чтобы запустить двоичный файл на вашем 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 () выполняет свою работу в соответствии с объявлением.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top