My app crashes due to it running out of memory. As I play I just watch the memory increase and increase in the window task manager.
The program goes from 47mb at start up, to sometimes over 200mb after playing for about 10 minutes.
Anyway, let me start off by showing you how I create objects.
The Sprite class:
class CSpriteImage
{
private:
unsigned int Image; //default image
unsigned int sprite; //sprite for default image
float xpos,ypos;
public:
CSpriteImage(const char *img, float x, float y) //constructor
{
Image = agk::LoadImage(img);
img=NULL;
sprite = agk::CreateSprite(Image);
xpos=x; ypos=y;
}
~CSpriteImage()
{
agk::DeleteImage(Image);
agk::DeleteSprite(sprite);
}
void SetSizeOfSprite(float w, float h)
{
agk::SetSpriteSize(sprite,w,h);
return;
}
void SetPositionOfSprite(float x, float y)
{
agk::SetSpritePosition(sprite,x,y);
return;
}
void SetDepthOfSprite(int _depth)
{
agk::SetSpriteDepth(sprite,_depth);
return;
}
void SetSpriteAlpha(int _alpha)
{
agk::SetSpriteColorAlpha(sprite, _alpha);
return;
}
void SetColorOfSprite(int r, int g, int b, int a)
{
agk::SetSpriteColor(sprite,r,g,b,a);
return;
}
float ReturnImageHeight()
{
return agk::GetImageHeight(Image);
}
float GetXpos()
{
return xpos;
}
float GetYpos()
{
return ypos;
}
unsigned int GetSprite()
{
return sprite;
}
};
The Virtual button class:
class CVirtualBtn //Create Virtual Buttons for game
{
private:
float xpos,ypos,size;
unsigned int btnIndex;
unsigned int btnImageUp;
unsigned int btnImageDwn;
unsigned int btnAlpha;
int btnVisibility;
int btnActive,visible;
const char *btnName;
public:
CVirtualBtn(const char *Img, const char *Img2 ,const char *nm, float x, float y, float sz, unsigned int _index)
{
btnImageUp = agk::LoadImage(Img);
btnImageDwn = agk::LoadImage(Img2);
xpos=x; ypos=y; size=sz;
btnIndex=_index;
btnName=nm;
btnVisibility=1;btnAlpha=1;btnActive=1;btnAlpha=255;
agk::AddVirtualButton(btnIndex,xpos,ypos,size);
agk::SetVirtualButtonImageUp(btnIndex,btnImageUp);
agk::SetVirtualButtonImageDown(btnIndex,btnImageDwn);
}
~CVirtualBtn()
{
agk::DeleteImage(btnImageUp);
agk::DeleteVirtualButton(btnIndex);
}
void Render()
{
agk::SetVirtualButtonAlpha(btnIndex,btnAlpha);
agk::SetVirtualButtonVisible(btnIndex,btnVisibility);
return;
}
void Update()
{
agk::SetVirtualButtonActive(btnIndex,btnActive);
agk::SetVirtualButtonSize(btnIndex,size);
return;
}
void SetButtonAlpha(unsigned int alpha)
{
btnAlpha=alpha;
return;
}
void SetButtonVisibility(int vis)
{
btnVisibility=vis;
return;
}
void ActivateButton(int active)
{
btnActive=active;
return;
}
void SetButtonSize(float _size)
{
size=_size;
return;
}
int BtnPressed()
{
return agk::GetVirtualButtonPressed(btnIndex);
}
unsigned int GetButtonIndex()
{
return btnIndex;
}
int BtnReleased()
{
return agk::GetVirtualButtonReleased(btnIndex);
}
};
When I create an object I do:
//declaration
CSpriteImage *LeadersBoard[2];
.
.
.
//call to create title screen board
void CreateTitleScreenButtons()
{
//create virtual buttons
//TitleBtns[0] = new CVirtualBtn("pics/tiles/startbtn.png","","Start",30,50,15,1);
//TitleBtns[1] = new CVirtualBtn("pics/tiles/howtoplay.png","","HowToPlay",30,70,15,2);
TitleBtns[0] = new CVirtualBtn("pics/tiles/exit.png","pics/tiles/exitrollover.png","exit",16,92,((SPRITE_SIZE+3)/2),1);
TitleBtns[1] = new CVirtualBtn("pics/tiles/fb.png","pics/tiles/fbrollover.png","facebook",54,92,((SPRITE_SIZE+3)/2),2);
TitleBtns[2] = new CVirtualBtn("pics/tiles/leaders.png","pics/tiles/leaderrollover.png","leader",35,92,((SPRITE_SIZE+3)/2),3);
startbtn = new CSpriteImage("pics/tiles/startbtn2.png",30.00f,55.00f);
startbtn->SetPositionOfSprite(1.00f,55.00f);
startbtn->SetSizeOfSprite(30.00f,-1.0f);
startbtn->SetDepthOfSprite(5);
startbtnrollover = new CSpriteImage("pics/tiles/startbtnrollover.png",30.00f,55.00f);
startbtnrollover->SetPositionOfSprite(-100.00f,55.00f);
startbtnrollover->SetSizeOfSprite(30.00f,-1.0f);
startbtnrollover->SetDepthOfSprite(5);
senseibtn = new CSpriteImage("pics/tiles/sensei.png",90.00f,65.00f);
senseibtn->SetPositionOfSprite(8.00f,63.00f);
senseibtn->SetSizeOfSprite(30.00f,-1.0f);
senseibtnrollover = new CSpriteImage("pics/tiles/senseirollover.png",90.00f,75.00f);
senseibtnrollover->SetPositionOfSprite(-100.00f,55.00f);
senseibtnrollover->SetSizeOfSprite(30.00f,-1.0f);
howtoplbtn = new CSpriteImage("pics/tiles/howtoplay2.png",70.00f,65.00f);
howtoplbtn->SetPositionOfSprite(14.00f,71.00f);
howtoplbtn->SetSizeOfSprite(30.00f,-1.0f);
howtoplbtnrollover = new CSpriteImage("pics/tiles/howtoplayrollover.png",70.00f,65.00f);
howtoplbtnrollover->SetPositionOfSprite(-100.00f,65.00f);
howtoplbtnrollover->SetSizeOfSprite(30.00f,-1.0f);
optionsbtn = new CSpriteImage("pics/tiles/options2.png",110.00f,85.00f);
optionsbtn->SetPositionOfSprite(20.00f,79.00f);
optionsbtn->SetSizeOfSprite(30.00f,-1.0f);
optionsbtnrollover = new CSpriteImage("pics/tiles/optionsrollover.png",110.00f,85.00f);
optionsbtnrollover->SetPositionOfSprite(-100.00f,75.00f);
optionsbtnrollover->SetSizeOfSprite(30.00f,-1.0f);
birdFirstpic->SetPositionOfSprite(45.00f,35.00f);
if(SENSEIOPTION==0)//zero to start
{
//grey out button
senseibtn->SetColorOfSprite(64,64,64,250);
}
//title
Title = new CSpriteImage("pics/tiles/title.png",10.0f, 10.0f);
Title->SetPositionOfSprite(10.50f,8.00f);
Title->SetSizeOfSprite(70.00f,-1.0f);
Title->SetDepthOfSprite(5);
return;
}
When I delete an object I do:
void DestroyTitleScreenButtons()
{
int i=0;
while (i <= 2)
{
if (TitleBtns[i] != NULL)
{
delete TitleBtns[i];
TitleBtns[i]=NULL;
}
i++;
}
if(startbtn !=NULL){delete startbtn;startbtn=NULL;}
if(startbtnrollover !=NULL){delete startbtnrollover;startbtnrollover=NULL;}
if(howtoplbtn !=NULL){delete howtoplbtn;howtoplbtn=NULL;}
if(howtoplbtnrollover !=NULL){delete howtoplbtnrollover;howtoplbtnrollover=NULL;}
if(optionsbtn !=NULL){delete optionsbtn;optionsbtn=NULL;}
if(optionsbtnrollover !=NULL){delete optionsbtnrollover;optionsbtnrollover=NULL;}
if(senseibtn !=NULL){delete senseibtn;senseibtn=NULL;}
if(senseibtnrollover !=NULL){delete senseibtnrollover;senseibtnrollover=NULL;}
if(Title !=NULL){delete Title;Title=NULL;}
return;
}
Now, all throughout my code when I create an object I make sure I delete it. I don't know why it constantly increases in memory.
When I go to the next screen it loads what it needs, and when I look at the task manager I can see the memory increases as it should, but when I exit that screen and then call the delete function, the memory usage doesn't go down but in fact goes up.
Am I deleting things properly when I create them?
Prove Your Worthiness
KG2Entertainment.com