在加载BMP函数SDL

时间:2019-12-27 16:37:07

标签: c sdl ram

我正在使用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库调用来完成以创建窗口等

https://i.ibb.co/YBcvjnF/Bez-tytu-u.png

1 个答案:

答案 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]);