Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


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.

  • You cannot reply to this topic
2 replies to this topic

#1 BaneTrapper   Members   -  Reputation: 1232

Like
0Likes
Like

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.

Current projects:
The Wanderer, 2d turn based rpg style game

www.gamedev.net/topic/641117-check-up-the-wanderer/


Sponsor:

#2 fastcall22   Crossbones+   -  Reputation: 4389

Like
1Likes
Like

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

c3RhdGljIGNoYXIgeW91cl9tb21bMVVMTCA8PCA2NF07CnNwcmludGYoeW91cl9tb20sICJpcyBmYXQiKTs=

#3 BaneTrapper   Members   -  Reputation: 1232

Like
0Likes
Like

Posted 12 August 2012 - 02:43 AM

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


Current projects:
The Wanderer, 2d turn based rpg style game

www.gamedev.net/topic/641117-check-up-the-wanderer/





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.



PARTNERS