OpenGL glDeleteTextures приводит к утечке памяти? - PullRequest
1 голос
/ 19 марта 2012

Моя программа отображает большие jpegs в виде текстур по одной за раз и позволяет пользователю переключаться между ними, повторно используя "одну и ту же" текстуру.

Я звоню glGenTextures(1, &texture); один раз в начале.

Затем каждый раз, когда я хочу поменять местами изображение, которое я использую:

FreeTexture( texture );
ROI_img = fetch_image(temp, sortVector[tPiece]);

loadTexture_Ipl( ROI_img , &texture );

вот две вызываемые функции:

int loadTexture_Ipl(IplImage *image, GLuint *text)
{
    if (image==NULL) return -1;
    glBindTexture( GL_TEXTURE_2D, *text );

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ROI_WIDTH, ROI_HEIGHT,0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData);
    return 0;
}

void FreeTexture(GLuint texture)
{
    glDeleteTextures( 1, &texture);
}

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

test(55248,0xacdf22c0) malloc: *** mmap(size=744001536) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Mar 19 11:57:51 Ants-MacBook-Pro.local test[55248] <Error>: CGSImageDataLock: Cannot allocate memory

Я думал, что glDeleteTextures будет каждый раз освобождать память ??

Есть идеи, как лучше это реализовать?

p.s. Вот экран с обнаруженными утечками памяти (https://p.twimg.com/AoWVy8FCMAEK8q7.png:large)

1 Ответ

4 голосов
/ 19 марта 2012

Поскольку вы хотите повторно использовать вашу текстуру, вы не должны удалять ее с помощью glDeleteTextures.Если вы сделаете это, вам нужно создать новую текстуру, используя glGenTextures, и я не вижу, чтобы вы делали это в функции loadTexture_Ipl.

...