首页 > 解决方案 > 在加载 BMP 函数 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

标签: csdlram

解决方案


如果我理解正确,您会SDL_Surface*一遍又一遍地制作,您永远不会致电SDL_FreeSurface()info)。

您需要加载播放动画所需的所有 BMP,SDL_Surface*然后重用这些 BMP。

在您的 main(或 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]);

推荐阅读