• Create Account

## SDL_ttf leaking problem FIXED

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

2 replies to this topic

### #1BaneTrapper  Members

Posted 10 August 2012 - 11:17 AM

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.

### #2fastcall22  Moderators

Posted 10 August 2012 - 12:23 PM

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


zlib: eJzVVLsSAiEQ6/1qCwoK i7PxA/2S2zMOZljYB1TO ZG7OhUtiduH9egZQCJH9 KcJyo4Wq9t0/RXkKmjx+ cgU4FIMWHhKCU+o/Nx2R LEPgQWLtnfcErbiEl0u4 0UrMghhZewgYcptoEF42 YMj+Z1kg+bVvqxhyo17h nUf+h4b2W4bR4XO01TJ7 qFNzA7jjbxyL71Avh6Tv odnFk4hnxxAf4w6496Kd OgH7/RxC

### #3BaneTrapper  Members

Posted 12 August 2012 - 02:43 AM

Thank you for sharing that knowledge with everyone.