Sign in to follow this  
Followers 0
BaneTrapper

SDL_ttf leaking problem FIXED

2 posts in this topic

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:
[CODE]
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);
}
[/CODE]
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
[CODE]
SDL_FreeSurface(surf_Text1);
[/CODE]


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.
0

Share this post


Link to post
Share on other sites
[quote name='BaneTrapper' timestamp='1344619020' post='4968145']
Hello.
Currently at my code i found i have a huge leak... around 8mb per sec, with future analysis i discovered the problem:
[/quote]
When SDL_TTF renders a font, it creates a new SDL_Surface and renders the text onto the new image. SDL_TTF also assumes [url=http://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf_43.html#SEC43]you[/url] 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:

[CODE]
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 );
}
[/CODE]


[quote name='BaneTrapper' timestamp='1344619020' post='4968145']
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.
[/quote]

You [b]MUST[/b] 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 [i]once[/i] and use those SDL_Surfaces as a cache:

[code]
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 );
}
[/code]
1

Share this post


Link to post
Share on other sites
[quote name='fastcall22' timestamp='1344622986' post='4968154']
Thank you for sharing that knowledge with everyone.
Very helpful.
[/quote]
0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0