2012-07-14 73 views
1

我正在为我制作的游戏创建基本的SDL + OpenGL级别编辑器,并且在创建动态TTF表面时遇到一些非常严重的内存泄漏,然后将它们转换为OpenGL纹理。SDL TTF库内存泄漏(每帧创建和释放表面)

例如:

每一帧,我跑了一些代码,看起来像这样:

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它表明很多比较大的内存泄漏。当我在活动监视器(Mac)中监视程序时,它可能会攀升至近500 MB的内存使用量,并可能从此处继续。

这里的Valgrind的错误(S):

==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); 

回答

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! 

请注意,以获得最佳性能,你应该某处缓存那些表面,而不是创造&摧毁他们的每一帧。

+0

当我这样做的时候,它仍然在上升......当我关注opengl Gluint变量时,它每次都稳步上升。有没有一种方法可以释放opengl纹理? – 2012-07-14 15:50:20

+0

啊,没关系。忘了'glDeleteTextures(1,&status_bottom_gl);'等等。 – 2012-07-14 15:55:47