OpenGL ES: FBO / Текстура утечки памяти - PullRequest
0 голосов
/ 02 января 2012

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

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

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

Я знаю, что это связано с созданием дополнительных текстур иОбъекты кадрового буфера (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(); 
}

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

Ответы [ 2 ]

1 голос
/ 12 января 2012

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

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

glGenTextures(1, &ResultTexture);
glGenFramebuffersOES(1, &ResultTextureFBO);
1 голос
/ 03 января 2012

То, что вы делаете, выглядит хорошо, но вы никогда не удаляете текстуры или FBO.Вам нужно позвонить:

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

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

...