0

Я работал с примером GLImageProcessing от Apple - где я применяю различные фильтры к изображению. Я следил за GLImageProcessing Multiple Filters?, чтобы он работал с двумя фильтрами.OpenGL ES: FBO/Texture Leaks Memory

Оригинальный пример Apple отлично работает, не утечка памяти.

Используя код из Вопроса, упомянутого выше, приложение потребляет всю память iPhone за 10-20 секунд использования, предоставляя мне Предупреждение о Памяти и, наконец, приводя к сбою приложения.

Я знаю, что это связано с созданием фильме текстур и Frame Buffer объектов (FBO), но я не знаю, как правильно управлять ими (и их память)

Код:

void drawGL(int wide, int high, float contrastVal,float brightnessVal) 
{ 
    //INIT 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrthof(0, wide, 0, high, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glScalef(wide, high, 1); 


    glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, (GLint *)&SystemFBO); 


    // Create the texture and the FBO the will hold the result of applying the first filter 
    glGenTextures(1, &ResultTexture); 
    glBindTexture(GL_TEXTURE_2D, ResultTexture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wide, high, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glGenFramebuffersOES(1, &ResultTextureFBO); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, ResultTextureFBO); 
    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, ResultTexture, 0); 


    glBindFramebufferOES(GL_FRAMEBUFFER_OES, ResultTextureFBO); 
    glBindTexture(GL_TEXTURE_2D, Input.texID); 

    glViewport(0, 0, wide, high); 
    brightness(flipquad, contrastVal); 
    glCheckError();; 


    glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO); 
    glBindTexture(GL_TEXTURE_2D, ResultTexture); 

    glViewport(0, 0, wide, high); 
    contrast(fullquad,brightnessVal); 
    glCheckError(); 
} 

Есть лучший способ сделать это?

ответ

1

Что вы делаете, выглядит хорошо, но вы никогда не удаляете текстуры или ФО. Вам необходимо позвонить:

glDeleteTextures (1, ResultTexture); 
glDeleteBuffers (1, ResultTextureFBO); 

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

1

У меня была такая же проблема. Предупреждение о памяти, похоже, является результатом генерации текстур при каждом вызове метода.

Поэтому попытайтесь переместить следующие строки в методе InitGL вашего примера кода:

glGenTextures(1, &ResultTexture); 
glGenFramebuffersOES(1, &ResultTextureFBO);