Hi,
i’m making my little program, kinda remake of robocop arcade bonus stage.
I noticed a memory leak when i call my function “calcular_render”, grabbing 200
kb /second. I dunno what might be the cause. Any ideas? Thanks in advance,
here’s the complete code (I’m working in DevCpp):
This is a Class i’m using:
class Csprite
{
public:
int layer;
int x0,y0;
int xactual,yactual;
int velocidad;
int idximagenes1;
int idximagenes2;
int idximagenes3;
int idximagenes4;
int idximagenes5;
SDL_TimerID spritetimer;
//SDL_NewTimerCallback
//Uint32 callbacktimerproc(Uint32 intervalo,void *param);
bool activo;
FILE *archlog;
char imagenes1[20][256];
char imagenes2[20][256];
char imagenes3[20][256];
char imagenes4[20][256];
char imagenes5[20][256];
char frameactual[256];
//char caminar[7][256];
char pegar1[13][256];
void logger_open(char spriteID[256]);
void logger_write(char* txt);
void logger_close();
void initpos(int idx){idx = 0;};
void sel_frameactual(char* factual);
//void mandar_a_mainframe(SDL_Surface mainframe,bool clsok);
void fill_image_arrays(char img0,char* img1,char* img2,char* img3,char*
img4,char* img5,
char* img6,char* img7,char* img8,char* img9,char* img10,int vecnum);
void changespriteattr(int x,int y,int velocidad);
char diractual[256];
char wkingdir_sprites[256];
char wkingdir_sounds[256];
char wkingdir_background[256];
void setwkingdir(HWND handler);
};
This is an array of pointers to Csprite Class i’m using:
Csprite* sprites1[10];
This is the mainloop:
int maingameloop(HWND handler)
{
SDL_KeyboardEvent *tclevento;
SDL_Event evento;
int running = 1;
int X0 = 100;
int Y0 = 220;
bool salir;
int opsalir;
//eliminar despues de probar, son de calcular_render
int e;
int t;
SDL_Surface *imagen;
SDL_Rect dest;
salir = false; /SDL_DEFAULT_REPEAT_DELAY = 500/
/SDL_DEFAULT_REPEAT_INTERVAL = 30/
//mira.initpos();
//mira.changespriteattr(200,100,3);
cuadro_princi.logger_write(“mira.initpos();”);
sprites1[0]->sel_frameactual(sprites1[0]->imagenes1[0]);
sprites1[1]->sel_frameactual(sprites1[1]->imagenes1[0]);
cuadro_princi.logger_write(“mira.sel_frameactual(mira.imagenes1[0]);”);
cuadro_princi.logger_write(sprites1[0]->frameactual);
cuadro_princi.logger_write(sprites1[1]->frameactual);
//mira.mandar_a_mainframe(cuadro_princi.screen,true);
cuadro_princi.logger_write(“mira.mandar_a_mainframe(cuadro_princi.screen);”);
calcular_render();
//MessageBox(handler,“antes de todo”,"",MB_OK);
cuadro_princi.showframe();
cuadro_princi.rendertimer = SDL_AddTimer(100,callbackRENDER,0);
cuadro_princi.logger_write(“cuadro_princi.showframe();”);
SDL_EnableKeyRepeat(100 ,10);
//16.67 ms
pause = FALSE;
//cuadro_princi.clsok = true;
while(!salir)
{
//30 ms aprox
cuadro_princi.intervalo_render = 100;
cuadro_princi.time_refbase = 0;
cuadro_princi.time_actual = 0;
while(running)
{
while(SDL_PollEvent(&evento) )
{
/*if(cuadro_princi.time_refbase != -1)
cuadro_princi.time_refbase = SDL_GetTicks();
if( cuadro_princi.tomar_tiempo(cuadro_princi.intervalo_render))
cuadro_princi.time_actual = SDL_GetTicks();*/
/*if( cuadro_princi.tomar_tiempo(cuadro_princi.intervalo_render))
{
cuadro_princi.showframe();
}*/
switch(evento.type)
{
case SDL_USEREVENT:
switch(evento.user.code)
{
case 666:
calcular_render();
cuadro_princi.showframe();
break;
case 0:
break;
}
break;
case SDL_KEYDOWN:
case SDL_KEYUP:
switch(evento.key.keysym.sym)
{
//tropico = 0
//meridiano = 1
case SDLK_LEFT:
//dibujar meridiano |
sprites1[1]->changespriteattr(sprites1[1]->xactual -
sprites1[1]->velocidad,0,3);
//calcular_render(cuadro_princi.screen,handler);
break;
case SDLK_RIGHT:
//dibujar meridiano |
sprites1[1]->changespriteattr(sprites1[1]->xactual +
sprites1[1]->velocidad,0,3);
//calcular_render(cuadro_princi.screen,handler);
break;
case SDLK_UP:
//dibujar tropico -
sprites1[0]->changespriteattr(sprites1[0]->xactual,sprites1[0]->yactual -
sprites1[0]->velocidad,3);
//calcular_render(cuadro_princi.screen,handler);
break;
case SDLK_DOWN:
//dibujar tropico -
sprites1[0]->changespriteattr(sprites1[0]->xactual,sprites1[0]->yactual +
sprites1[0]->velocidad,3);
//calcular_render(cuadro_princi.screen,handler);
break;
case SDLK_p:
break;
case SDLK_RETURN:
//SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void
*param);
break;
case SDLK_ESCAPE:
running = 0;
break;
}
break;
case SDL_QUIT:
running = 0;
break;
}
}
} //while running
opsalir = MessageBox(handler,“Salir no jogo?”,“Pregunta de los que
saben”,MB_YESNOCANCEL | MB_ICONQUESTION);
if( opsalir == IDYES)
salir = 1;
}//while !salir
SDL_RemoveTimer(cuadro_princi.rendertimer);
return 0;
}
And this is the leaking function itself:
void calcular_render()
{
int e;
int t;
SDL_Surface *imagen;
SDL_Rect dest;
//sprites1[0]->logger_write(“Calcular Render”);
//LAYER 3 = fondo
for(e =0;e<11;e++)
{
//si el puntero a csprite no es nulo y esta activo
if( (sprites1[e] != 0) && ( sprites1[e]->activo != 0) )
{
if(sprites1[e]->layer == 3)
{
//sprites1[e]->logger_write("LAYER 3 FOUND");
if( strcmp( sprites1[e]->imagenes1[sprites1[e]->idximagenes1],"nil") != 0)
{
//sprites1[e]->logger_write("LAYER 3 INSIDE");
sprites1[e]->sel_frameactual(sprites1[e]->imagenes1[sprites1[e]->idximagenes1]);
//sprites1[e]->logger_write("Csprite: Loading Image :");
//sprites1[e]->logger_write(sprites1[e]->frameactual);
imagen = SDL_LoadBMP(sprites1[e]->frameactual);
//sprites1[e]->logger_write("Csprite: SDL_SetColorKey( )");
//cyan
SDL_SetColorKey( imagen, SDL_SRCCOLORKEY, SDL_MapRGB(imagen->format,
255, 0, 255) );
//sprites1[e]->logger_write("Csprite: asignando valores a Rectangulo Dest");
dest.x = sprites1[e]->xactual;
dest.y = sprites1[e]->yactual;
dest.w = imagen->w;
dest.h = imagen->h;
//sprites1[e]->logger_write("Csprite: Blitting surface : SDL_BlitSurface");
SDL_BlitSurface(imagen, NULL, cuadro_princi.screen, &dest);
}
}
}
}//for LAYER 3
SDL_FreeSurface(imagen);
//LAYER 2 = ENEMIGOS
for(e =0;e<11;e++)
{
//si el puntero a csprite no es nulo y esta activo
if( (sprites1[e] != 0) && ( sprites1[e]->activo != 0) )
{
if(sprites1[e]->layer == 2)
{
//sprites1[e]->logger_write("LAYER 2 FOUND");
if( strcmp( sprites1[e]->imagenes1[sprites1[e]->idximagenes1],"nil") != 0)
{
//sprites1[e]->logger_write("LAYER 2 INSIDE");
sprites1[e]->sel_frameactual(sprites1[e]->imagenes1[sprites1[e]->idximagenes1]);
//sprites1[e]->logger_write("Csprite: Loading Image :");
//sprites1[e]->logger_write(sprites1[e]->frameactual);
imagen = SDL_LoadBMP(sprites1[e]->frameactual);
//sprites1[e]->logger_write("Csprite: SDL_SetColorKey( )");
//cyan
SDL_SetColorKey( imagen, SDL_SRCCOLORKEY, SDL_MapRGB(imagen->format,
255, 0, 255) );
//sprites1[e]->logger_write("Csprite: asignando valores a Rectangulo Dest");
dest.x = sprites1[e]->xactual;
dest.y = sprites1[e]->yactual;
dest.w = imagen->w;
dest.h = imagen->h;
//sprites1[e]->logger_write("Csprite: Blitting surface : SDL_BlitSurface");
SDL_BlitSurface(imagen, NULL, cuadro_princi.screen, &dest);
}
}
}
}//for LAYER 2
SDL_FreeSurface(imagen);
//LAYER 1 = objetos controlados por el jugador
for(e =0;e<11;e++)
{
//si el puntero a csprite no es nulo y esta activo
if( (sprites1[e] != 0) && ( sprites1[e]->activo != 0) )
{
if(sprites1[e]->layer == 1)
{
//sprites1[e]->logger_write("LAYER 1 FOUND");
if( strcmp( sprites1[e]->imagenes1[sprites1[e]->idximagenes1],"nil") != 0)
{
//sprites1[e]->logger_write("LAYER 1 INSIDE");
sprites1[e]->sel_frameactual(sprites1[e]->imagenes1[sprites1[e]->idximagenes1]);
//MessageBox(handler,"Layer 1 sel_frameactual","",MB_OK);
//sprites1[e]->logger_write("Csprite: Loading Image :");
//sprites1[e]->logger_write(sprites1[e]->frameactual);
imagen = SDL_LoadBMP(sprites1[e]->frameactual);
//MessageBox(handler,"Layer 1 SDL_LOADBMP OK","",MB_OK);
//MessageBox(handler,"Layer 1 BMP = ",sprites1[e]->frameactual,MB_OK);
if(!imagen)
{
sprites1[e]->logger_write("Error! imagen is NULL ");
//MessageBox(handler,"Layer 1 SDL_LOADBMP: !IMAGEN","",MB_OK);
}
//sprites1[e]->logger_write("Csprite: SDL_SetColorKey( )");
//cyan
SDL_SetColorKey( imagen, SDL_SRCCOLORKEY, SDL_MapRGB(imagen->format,
255, 0, 255) );
//MessageBox(handler,"Layer 1 SETCOLORKEY OK","",MB_OK);
//sprites1[e]->logger_write("Csprite: asignando valores a Rectangulo Dest");
dest.x = sprites1[e]->xactual;
dest.y = sprites1[e]->yactual;
dest.w = imagen->w;
dest.h = imagen->h;
//sprites1[e]->logger_write("Csprite: Blitting surface : SDL_BlitSurface");
if(SDL_BlitSurface(imagen, NULL, cuadro_princi.screen, &dest) == -1 )
sprites1[e]->logger_write("SDL_BlitSurface Failed");
}
}
}
}//for LAYER 1
//MessageBox(handler,“Layer 1 ok”,"",MB_OK);
SDL_FreeSurface(imagen);
}