我正在使用SDL编写一个简单的游戏,但是我遇到了一个大问题-我正在尝试制作一些具有功能的动画, 在功能上,我调用static int,它会不断提高每个游戏滴答声,并且取决于static int的值,因此我更改了变量图像(image = SDL_LoadBMP(myfile)),效果很好,但是在运行程序10分钟后,在没有这个非常简单的动画的情况下就已经使用了50MB的内存,我程序的ram使用率开始变得越来越大,正如我说的,在10分钟后,它的内存为3GB,并不断提高每个动画的发生率(因此,就像每3秒)。
奇怪的是,我还有其他图像,其动画有点简单-我通过单击任意箭头(仍在主窗口中)更改了图像,然后调用函数,因此一秒钟后,它将初始图像返回给一个变量(它使图像恢复功能),而且效果很好-我的意思是-即使我一直单击箭头,内存使用情况也是恒定的。
我的功能如下:
void func(obj* image)
{
static int time1;
time1++;
if(time1>1000)
{
time1=0;
SDL_FreeSurface(image->image); //this doesn't change anything
image->image=SDL_LoadBMP("path");
}
else if(time1>800)
image->image=SDL_LoadBMP("path2");
else if(time1>600)
image->image=SDL_LoadBMP("path3");
else if(time1>400)
image->image=SDL_LoadBMP("path4");
}
typedef struct {
SDL_Surface* image;
}obj;
int main()
{
obj struct;
func(&struct);
}
ofc可以通过所有这样的SDL库调用来完成以创建窗口等
答案 0 :(得分:2)
如果我正确理解您是一遍又一遍地制作SDL_Surface*
,则您永远不会致电SDL_FreeSurface()
(info)。
您需要将播放动画所需的所有BMP加载到SDL_Surface*
中,然后再使用这些BMP。
在主程序(或init函数)中,您需要将BMP图像存储到数组或指针中。
// Somewhere on one of your struct
SDL_Surface *animationImages[4];
// Then in an init function you do
animationImages[0] = SDL_LoadBMP("path");
animationImages[1] = SDL_LoadBMP("path2");
animationImages[2] = SDL_LoadBMP("path3");
animationImages[3] = SDL_LoadBMP("path4");
// And finally
void func(obj* image) {
static int time1;
time1++;
if (time1>1000) {
time1 = 0;
image->image = animationImages[0];
} else if (time1>800) {
image->image = animationImages[1];
} else if (time1>600) {
image->image = animationImages[2];
} else if (time1>400) {
image->image = animationImages[3];
}
}
在游戏结束之前或不再需要这些animationImages
时,请为您创建的每个SDL_FreeSurface()
调用SDL_Surface*
。
// In a specific function used to clean up allocated stuff you do
SDL_FreeSurface(animationImages[0]);
SDL_FreeSurface(animationImages[1]);
SDL_FreeSurface(animationImages[2]);
SDL_FreeSurface(animationImages[3]);