c - 在加载 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 库调用来制作一个窗口等
解决方案
如果我理解正确,您会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]);
推荐阅读
- vue.js - Nuxt - 是否可以检查用户是否从 SSR 登录?
- firebase - 如何过滤地图/Firestore Flutter
- json - 将 log4j2 JsonLayout 输出转换为另一个布局
- node.js - 如何在 USDA API 中输入份量?
- java - 如何更改 Vert.x (java) 中的默认会话超时
- html - 如何从 div 父级中选择第一个子级 div
- javascript - 插入带有 postgis 扩展名的 postgres 表时收到无效的几何错误
- go - 使用 golang 在 Machinebox GraphQL 突变中将嵌套 JSON 作为变量传递
- unity3d - 不可靠/令人困惑的 MRTK 按钮触摸注册行为 [Unity,Hololens2]
- reactjs - 响应式轮播,在 React 中更改移动设备上的 itemsToShow