SDL_FreeSurface



  • So, ich habe nun eine frage über die Funktion FreeSurface.
    Ich schreibe zur Zeit an meiner Abschlussarbeit und habe noch einige Zweifel wenn es um FreeSurface bei TTF geht.

    Hier ist mein Quellcode für ein Menü.
    Es läuft perfekt, nur habe ich irgendwie Zweifel, dass es mit der Zeit Probleme mit dem Speicher geben kann weil ich nur die Resourcen für eine Instanze freigebe (so vestehe ich das).

    Oder ist die variable SDL_surface mutable?

    #include <pspkernel.h>
    #include <pspctrl.h>
    
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_mixer.h>
    
    #define printf pspDebugScreenPrintf
    
    PSP_HEAP_SIZE_KB(20480);
    
    	SDL_Surface *screen;
    	SDL_Surface *temp, *bg, *intro;
    	SDL_Surface *text;
    
    	SDL_Rect font;
    	SDL_Rect spriteSoruce, spriteDestination;
    
    	TTF_Font *fontLabel;
    	SDL_Color unmarkedtext, markedtext;
    
    int ExitCallback(int Arg1, int Arg2, void *Common)
    {
        sceKernelExitGame();
        return 0;
    }
    
    int CallbackThread(SceSize Args, void *Argp)
    {
        int CallbackId = sceKernelCreateCallback("Exit Callback", ExitCallback, NULL);
        sceKernelRegisterExitCallback(CallbackId);
        sceKernelSleepThreadCB();
        return 0;
    }
    
    int SetupCallbacks(void)
    {
        int ThreadId = sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0);
            if(ThreadId >= 0) sceKernelStartThread(ThreadId,0,0);
        return ThreadId;
    }
    
    void drawlabels(const char* labeltitel, int posx, int posy, SDL_Color lcolor)
    {
    	text = TTF_RenderText_Blended(fontLabel, labeltitel, lcolor);
    	font.x = posx;
    	font.y = posy;
    	SDL_BlitSurface(text, NULL, screen, &font);
    	//SDL_FreeSurface(text);
    }
    
    void controlmenu(int menucounter)
    {
    	switch(menucounter)
    	{
    		case 1:
    		{
    			drawlabels("ABC", 100, 100, markedtext);
    			drawlabels("DEF", 100, 150, unmarkedtext);
    			drawlabels("GHI", 100, 200, unmarkedtext);
    			break;
    		}
    
    		case 2:
    		{
    			drawlabels("ABC", 100, 100, unmarkedtext);
    			drawlabels("DEF", 100, 150, markedtext);
    			drawlabels("GHI", 100, 200, unmarkedtext);
    			break;
    		}
    
    		case 3:
    		{
    			drawlabels("ABC", 100, 100, unmarkedtext);
    			drawlabels("DEF", 100, 150, unmarkedtext);
    			drawlabels("GHI", 100, 200, markedtext);
    			break;
    		}
    	}
    }
    
    extern "C" int SDL_main (int argc, char* args[]);
    
    int main(int argc, char *args[])
    {
        SetupCallbacks();
    	bool OnStartGame = true;
    	bool OnMainMenu = false;
    
    	int UpDownSetting = 1;
    
    	SceCtrlData pad, lastpad;
    	sceCtrlReadBufferPositive(&lastpad, 1);	
    
        SDL_Init(SDL_INIT_VIDEO);
        SDL_ShowCursor(0);
    
        screen = SDL_SetVideoMode(480,272,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
    	TTF_Init();
    
    	fontLabel = TTF_OpenFont("fonts/comic.ttf", 14);
    	TTF_SetFontStyle(fontLabel, TTF_STYLE_BOLD);
    
    	bg = IMG_Load("mainmenu.jpg");
    	intro = IMG_Load("intro.jpg");
    	SDL_BlitSurface(intro, NULL, screen, NULL);
    
    	unmarkedtext.r = 255;	markedtext.r = 0;	
    	unmarkedtext.g = 255;	markedtext.g = 0;	
    	unmarkedtext.b = 255;	markedtext.b = 0;	
    
    	drawlabels("Press Start", 200, 200, unmarkedtext);	
    	SDL_Flip(screen);
    
    	while(true)
    	{
    		sceCtrlReadBufferPositive(&pad, 1);
    
    		if(pad.Buttons != lastpad.Buttons)
    		{
    		lastpad = pad;
    
    			if(pad.Buttons & PSP_CTRL_START)
    			{
    				if(OnStartGame)
    				{
    						OnStartGame = false;
    						OnMainMenu = true;
    						UpDownSetting = 1;
    
    						SDL_BlitSurface(bg, NULL, screen, NULL);
    						drawlabels("ABC", 100, 100, markedtext);
    						drawlabels("DEF", 100, 150, unmarkedtext);
    						drawlabels("GHI", 100, 200, unmarkedtext);
    
    						SDL_Flip(screen);
    				}
    			}
    
    			if(pad.Buttons & PSP_CTRL_CIRCLE)
    			{
    						OnStartGame = true;
    						OnMainMenu = false;
    						UpDownSetting = 1;
    						SDL_BlitSurface(intro, NULL, screen, NULL);
    						drawlabels("Press Start", 200, 200, unmarkedtext);
    						SDL_Flip(screen);
    			}
    
    			if(pad.Buttons & PSP_CTRL_UP)
    			{
    				if(OnMainMenu)
    				{
    					//OnStartGame = false;
    					UpDownSetting--;
    					if (UpDownSetting <= 1) UpDownSetting = 1;
    					SDL_BlitSurface(bg, NULL, screen, NULL);
    					controlmenu(UpDownSetting);
    					SDL_Flip(screen);
    				}
    			}
    
    			if(pad.Buttons & PSP_CTRL_DOWN)
    			{
    				if(OnMainMenu)
    				{
    					UpDownSetting++;
    					if (UpDownSetting >= 3) UpDownSetting = 3;
    					SDL_BlitSurface(bg, NULL, screen, NULL);
    					controlmenu(UpDownSetting);
    					SDL_Flip(screen);
    				}
    			}
    		}
    	}
    
    	SDL_FreeSurface(text);
    	SDL_FreeSurface(intro);
    	SDL_FreeSurface(bg);
    
        sceKernelSleepThread();
    
    return 0;
    }
    


  • Das leakt, und zwar bösartig bei jedem Aufruf der Funktion. Schnelle Abhilfe sollte etwas wie

    SDL_Surface *text = 0;
    /*...*/
    void drawlabels(const char* labeltitel, int posx, int posy, SDL_Color lcolor)
    {
        SDL_FreeSurface(text); //afaik geht SDL_Freesurface auf NULL, sonst halt explizit prüfen
        text = TTF_RenderText_Blended(fontLabel, labeltitel, lcolor);
        font.x = posx;
        font.y = posy;
        SDL_BlitSurface(text, NULL, screen, &font);
        //SDL_FreeSurface(text);
    }
    

    Damit wird vor überschreiben des text pointers der alte speicherplatz freigegeben.


Log in to reply