• 13
• 18
• 19
• 27
• 9

RAM Leak - SDL & SDL_ttf

This topic is 3355 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

Hi! I am working on a rather simple game, and the project is pretty much finished. I have been following the amount of RAM the process uses periodically throughout developing this game. Thus, I when I encountered a nasty RAM leak, I was able to corner the problem immediately. Normally my program uses 3.3MB total, but with this code to print out a score and the clock, it will grow each time the screen is drawn. This is the code. clock_text and kills_text are both defined globally as follows: SDL_Surface *kills_text; SDL_Surface *clock_text; and are called in a seperate function as so:
int GamePaint(SDL_Surface* screen)

{
char dummy[50];
SDL_Rect offset;
SDL_Color textColor = { 0xDE, 0x30, 0xBA  };

//Get offsets

offset.x = 0;

offset.y = 440;

if (_iFlash < 1)

{

SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0x00, 0x64, 0xFF ) );

// Draw the sprites

DrawSprites(screen);

}

else

{

SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0x00, 0x00 ) );

--_iFlash;

}

SDL_BlitSurface(panel, NULL, screen, &offset );

sprintf(dummy, "%02d:%02d:%02d", myClock.hours, myClock.minutes, myClock.seconds);
clock_text = TTF_RenderText_Solid( font, dummy, textColor);
sprintf(dummy, "%i", _iScore);
kills_text = TTF_RenderText_Solid( font, dummy, textColor);

offset.x = 60;

offset.y = 441;
SDL_BlitSurface(kills_text, NULL, screen, &offset );
offset.x = 350;

offset.y = 441;
SDL_BlitSurface(clock_text, NULL, screen, &offset );

return 0;

}


Now, originally these surfaces were defined in the same function, but I then realized I was going to have to allocate and release each structure for every paint, which seemed very inefficient. I think it's obvious that the clock_text surface is being allocated dynamically at each function call to TTF_RenderText_Solid, but I don't want that to be the case, but rather have the image drawn over. I originally had the surfaces set to NULL before this code, but clearly that's not necessary with this bug. I've tried a couple things, but will research the functions I'm using more to see if I can't solve this on my own.

Share on other sites
If TTF_RenderText_Solid() allocates a new surface everytime it's called there's nothing you can do about it except of changing SDL_ttf itself. So, for now just calling SDL_FreeSurface() on those two surfaces should prevent that memory leak. And if your game ran fast enough till now that shouldn't change much. As SDL_ttf is already allocation memory there and freeing it shoulden't hit the performance that much.

Share on other sites
Quote:
 Original post by sebbitIf TTF_RenderText_Solid() allocates a new surface everytime it's called there's nothing you can do about it except of changing SDL_ttf itself. So, for now just calling SDL_FreeSurface() on those two surfaces should prevent that memory leak. And if your game ran fast enough till now that shouldn't change much. As SDL_ttf is already allocation memory there and freeing it shoulden't hit the performance that much.

That's indeed what I did to solve the problem. It seems inefficient but you're right, the performance is still satisfactory. I will meditate further on a better way to do my text drawing, in the case that in the future I have to draw enough text that performance may be a bigger concern. I'll also take a look at the library code to see if it doesn't provide some insight or maybe I can make or find a new function that does exactly what I want. It's open source so I wouldn't mind helping code it if I can.