在加载 BMP 函数 SDL 中提高 RAM

Raising RAM in load BMP function SDL

我正在使用 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 库调用来实现 window 等

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

如果我理解正确的话,你一遍又一遍地制作 SDL_Surface*,你永远不会调用 SDL_FreeSurface()(info).

您需要将播放动画所需的所有 BMP 加载到某个点 SDL_Surface*,然后重新使用这些 BMP。

在您的 main(或初始化函数)中,您需要将 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_Surface* 调用 SDL_FreeSurface()

// 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]);