SDL_ttf leaking problem FIXED

Started by
1 comment, last by BaneTrapper 11 years, 8 months ago
EDIT:: The problem is fixed.

Hello.
Currently at my code i found i have a huge leak... around 8mb per sec, with future analysis i discovered the problem:

surf_Text1 = TTF_RenderText_Solid(FT_Font1, "Continue", TextCol);
if(surf_Text1)
{
SDL_BlitSurface(surf_Text1, NULL, (*surf_Screen), &TextRec);
}
surf_Text1 = TTF_RenderText_Solid(FT_Font1, "NewGame", TextCol); //Leak occurs here
if(surf_Text1)
{
SDL_BlitSurface(surf_Text1, NULL, (*surf_Screen), &TextRec);
}

This code would per run cause memory leak.
But it would clean at exit of program.
If you call TTF_RenderText_Solid/Blended/Shaded on a non (empty/NULL) SDL_Surface i would get a leak.
I fixed problem by doing this before every call of TTF_RenderText_Solid

SDL_FreeSurface(surf_Text1);



But i got dozen of TTF_RenderText_Solid per loop, and i don't want to lose performance. Any way to fix this without having to call SDL_FreeSurface before TTF_RenderText_Solid.
Advertisement

Hello.
Currently at my code i found i have a huge leak... around 8mb per sec, with future analysis i discovered the problem:

When SDL_TTF renders a font, it creates a new SDL_Surface and renders the text onto the new image. SDL_TTF also assumes you will be responsible for the SDL_Surfaces it creates. If you neglect caring of ths SDL_Surface, the memory will naturally leak. Therefore, you need to call SDL_FreeSurface at the earliest point in which you no longer need that SDL_Surface:


surf_Text1 = TTF_RenderText_Solid(FT_Font1, "Continue", TextCol);
if(surf_Text1) {
SDL_BlitSurface(surf_Text1, NULL, (*surf_Screen), &TextRec);
SDL_FreeSurface( surf_Text1 );
}

surf_Text1 = TTF_RenderText_Solid(FT_Font1, "NewGame", TextCol);
if(surf_Text1) {
SDL_BlitSurface(surf_Text1, NULL, (*surf_Screen), &TextRec);
SDL_FreeSurface( surf_Text1 );
}




But i got dozen of TTF_RenderText_Solid per loop, and i don't want to lose performance. Any way to fix this without having to call SDL_FreeSurface before TTF_RenderText_Solid.


You MUST call SDL_FreeSurface for every TTF_RenderText_Solid. You can, however, control when you call SDL_FreeSurface. If the text for most of the rendering is constant, then you can render the text once and use those SDL_Surfaces as a cache:


void load_resources() {
textCache_Continue = TTF_RenderText_Solid( FT_Font1, "Continue", TextCol );
textCache_NewGame = TTF_RenderText_Solid( FT_Font1, "NewGame", TextCol );
}

void render() {
SDL_BlitSurface( textCache_Continue, 0, (*surf_Screen), &TextRec );
SDL_BlitSurface( textCache_NewGame, 0, (*surf_Screen), &TextRec );
}

void cleanup() {
SDL_FreeSurface( textCahce_Continue );
SDL_FreeSurface( textCahce_NewGame );
}

Thank you for sharing that knowledge with everyone.
Very helpful.

This topic is closed to new replies.

Advertisement