2009-12-09 5 views
2

Использование OpenGLES 1.1 на iPhone 3G (устройство, а не симулятор), я делаю обычное рисование весело. Но в точках во время запуска приложения я получаю гигантские всплески памяти, после большого поиска инструментов я обнаружил, что glDrawElements захватывает память.glDrawElements выделяет память и не освобождает ее

Выделяемый буфер составляет 4 мегабайта, что означает, что он загружает текстуру в ОЗУ, которая, как я думаю, может быть действительной, но никогда не освобождает этот буфер и выделяет несколько из них.

Как я могу убедиться, что эти буферы, созданные GL, будут уничтожены, а не просто повеситься?

ответ

0

Я понял это с помощью некоторых людей в IRC. Проблема закончилась тем, что я делал threading в своем приложении. Перемещая GL и цикл обновления игры в тот же поток, проблема исчезла, я не знаю, ПОЧЕМУ другой способ вызвал выделение памяти, но проблема решена.

+0

Может быть, потому, что вы не освобождали NSAutoreleasePool в фоновом потоке. –

0

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

+0

определенно тестирование на устройстве, отредактировал вопрос в соответствии с –

2

Это не похоже на утечку, больше похожую на оптимизацию драйвера, где GPU удерживается на блоке памяти (vertexbuffer, texture, whatever), если это необходимо снова. Если вы запустили приложение некоторое время, он будет выделять все больше и больше памяти, пока устройство в конечном итоге не исчерпает память?

К сожалению, первое поколение iPhone 3G не имеет надлежащей поддержки объектов-вершинного буфера (VBO), они открыты API, но они работают точно так же, как и обычные буферы программных вершин. Это означает, что всякий раз, когда вы вызываете glDrawElements, все буферы вершин, которые вы установили с помощью glVertexPointer и т. Д., Будут скопированы из системной памяти на GPU.

Единственный путь вы можете «утечка» память OpenGL является повторно выделить различные объекты буфера (текстурные объекты, объекты буфера вершин, буфер кадра объекты и т.д.) и, не отпуская их, как делает это каждый кадр:

GLuint id; 
glGenTextures(1, &id); 
glBindTexture(GL_TEXTURE_2D, id);   
glTexImage2D(...); 

у вас в конечном итоге закончится память. Я использую glDrawElements на iPhone 3G сам, и я не вижу этой проблемы, можете ли вы дать небольшой образец повторного кода?

+0

+1. Как побочная заметка, уничтожение GL-контекста должно вернуть память, если она запрограммирована правильно. – Bahbar

+0

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

+0

@Joshou Проверьте мой отредактированный ответ –

Смежные вопросы