Утечки памяти библиотеки SDL TTF (создание и освобождение поверхностей в каждом кадре)

Я создаю базовый редактор уровней SDL + OpenGL для игры, которую я делаю, и я сталкиваюсь с некоторыми довольно серьезными утечками памяти при создании динамических поверхностей TTF, а затем преобразовываю их в текстуры OpenGL.

Например:

В каждом кадре я запускаю некоторый код, который выглядит так:

shape_label = SDL_DisplayFormat(TTF_RenderText_Solid(font, shape_names[c2].c_str(), textColor));
shape_label_gl = gl_texture(shape_label);
draw_rect(shapes[c2][0], shapes[c2][1], shape_label->w, shape_label->h, shape_label_gl, 0);
SDL_FreeSurface(shape_label);

Однако, когда я использую valgrind, это предполагает множество относительно больших утечек памяти. Когда я отслеживаю программу в Activity Monitor (Mac), она может подняться почти до 500 МБ использования памяти и, вероятно, продолжит оттуда.

Вот ошибки valgrind:

==61330== 1,193,304 (13,816 direct, 1,179,488 indirect) bytes in 157 blocks are definitely lost in loss record 6,944 of 6,944
==61330==    at 0xB823: malloc (vg_replace_malloc.c:266)
==61330==    by 0x4D667: SDL_CreateRGBSurface (in /Library/Frameworks/SDL.framework/Versions/A/SDL)
==61330==    by 0xE84C3: TTF_RenderUNICODE_Solid (in /Library/Frameworks/SDL_ttf.framework/Versions/A/SDL_ttf)
==61330==    by 0xE836D: TTF_RenderText_Solid (in /Library/Frameworks/SDL_ttf.framework/Versions/A/SDL_ttf)
==61330==    by 0x10000A06D: SDL_main (in ./leveleditor)
==61330==    by 0x100013530: -[SDLMain applicationDidFinishLaunching:] (in ./leveleditor)
==61330==    by 0x65AD0D: __-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_1 (in /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation)
==61330==    by 0x36C7B9: _CFXNotificationPost (in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation)
==61330==    by 0x646FC2: -[NSNotificationCenter postNotificationName:object:userInfo:] (in /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation)
==61330==    by 0xB4C4E2: -[NSApplication _postDidFinishNotification] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit)
==61330==    by 0xB4C248: -[NSApplication _sendFinishLaunchingNotification] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit)
==61330==    by 0xB4AF0F: -[NSApplication(NSAppleEventHandling) _handleAEOpenEvent:] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit)

Любые идеи о том, как заставить TTF работать от кадра к кадру, не используя огромные объемы памяти?

РЕДАКТИРОВАТЬ: На будущее: я придурок. Я забыл сделать это:

glDeleteTextures(1, &status_bottom_gl);

person David Lougheed    schedule 14.07.2012    source источник


Ответы (1)


TTF_RenderText_Solid выделяет новую поверхность, которую вы не освобождаете:

SDL_Surface *ttf = TTF_RenderText_Solid(font, shape_names[c2].c_str(), textColor);
shape_label = SDL_DisplayFormat(ttf);
shape_label_gl = gl_texture(shape_label);
draw_rect(shapes[c2][0], shapes[c2][1], shape_label->w, shape_label->h, shape_label_gl, 0);
SDL_FreeSurface(shape_label);
SDL_FreeSurface(ttf); // Must free this as well!

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

person Karel Petranek    schedule 14.07.2012
comment
Когда я это делаю, он все еще растет... Когда я вычисляю переменную opengl Gluint, он каждый раз неуклонно растет. Есть ли способ бесплатно загрузить текстуры opengl? - person David Lougheed; 14.07.2012
comment
Ах, неважно. Забыл glDeleteTextures(1, &status_bottom_gl); или что-то подобное. - person David Lougheed; 14.07.2012