我想要使用vs2010的c++进行编程一个开车小游戏,但是在使用图像批处理函数时发生了内存冲突问题。
我发现他原本运行的好好的,突然就卡住了。点击关闭按钮就弹出来一个窗口,如下图。
我检查了多遍代码,发现去掉图像批处理函数后可以运行,但是会出现闪烁的问题。这令我很头大。
我现在急切的需要一个有效的解决方案,让程序能够正常运行且不发生闪烁。
如果有可以解决问题的方案请分享出来,让其他的遇到同样问题的网友得到解决,谢谢了。
我的代码如下。
#include
#include
#include
#include "ShowPrint.h"
#include
#include
using namespace std;
struct car{
int x;
int y;
int width;
int hight;
};
struct BK{
int x;
int y;
IMAGE img;
};
const int m=6;
int textx=0,score=0,speed=6,i=-5,r=5,sbx,b[m],clocks,clocko,zzz=144;
char s[9];
bool bool_;
ExMessage em;
IMAGE img,bg,sbl;
car c1;
car c2[m];
bool aaaaaa(int ax1,int ay1,int ax2,int ay2,int bx1,int by1,int bx2,int by2){
if(ax1<=bx1&&bx1<=ax2&&ay1<=by1&&by1<=ay2 || ax1<=bx2&&bx2<=ax2&&ay1<=by2&&by2<=ay2)return 1;
return 0;
}
void initset(){
c1.hight=200;
c1.width=100;
c1.x=0;
srand((unsigned)time(0));
initgraph(800, 800,EX_SHOWCONSOLE);
loadimage(&img,_T("C:\\Users\\jiang\\Desktop\\tt.png"),100,200);
loadimage(&bg,_T("C:\\Users\\jiang\\Desktop\\ttt.png"),800,800);
loadimage(&sbl,_T("C:\\Users\\jiang\\Desktop\\123.jpg"));
for(int j=0;jrand()%800;
c2[j].y=-201;
c2[j].x=(rand()%8)*100;
c2[j].width=100;
c2[j].hight=200;
}
}
void draw(){
cleardevice();
BeginBatchDraw();
putimage(0,i%800,&bg);
putimage(0,i%800-800,&bg);
for(int x=0;xif(i==b[x] && c2[x].y<-200)c2[x].y=-200;
putimage(c2[x].x,c2[x].y,&img);
}
for(int j=0;jif(c2[j].y>-201)c2[j].y+=speed;
}
i++;
for(int v=0;vif(c2[v].y>=800){
c2[v].x=rand()%800+5;
c2[v].y=-200;
i=0-r;
}if(aaaaaa(c2[v].x,c2[v].y,c2[v].x+c2[v].width,c2[v].y+c2[v].hight,c1.x,800-300,c1.x+c1.width,800-300+200)){
print("%d",193894243);
exit(0);
}
}
sprintf(s, "%d", score);
settextcolor(RGB(rand()%256,rand()%256,rand()%256));
outtextxy(textx, 0, s);
bool_=peekmessage(&em);
sbx=em.x;
if(sbx<700)c1.x=sbx;
if(score%5500==5499)speed++;
putimage(c1.x,800-300,&img);
EndBatchDraw();
}int main()
{
initset();
while(1){
clocks=clock();
textx++;
if(textx>=780)textx=0;
score++;
draw();
clocko=clock();
Sleep(1000/zzz-(clocko-clocks));
}
_getch(); // 按任意键继续
closegraph(); // 关闭绘图窗口
return 0;
}
参考GPT和自己的思路:
关于内存冲突的问题,可能是由于图像批处理函数的使用导致的。你可以尝试在进行图像批处理的时候使用加锁机制,以避免内存冲突的问题。具体方法如下:
1.在进行图像批处理函数之前,使用一把锁将共享的内存资源锁住。可以使用Windows API提供的临界区或者互斥对象等机制实现加锁。
2.进行图像批处理函数时,仅允许一个线程进行操作。可以使用单独的线程来进行图像批处理,避免多个线程同时访问内存资源产生冲突。
3.在图像批处理结束后,释放锁,使其他线程可以继续访问这些内存资源。
需要注意的是,在使用加锁机制时,需要谨慎处理锁的粒度,以避免锁住过多的内存资源导致性能下降。另外,还可以通过一些优化措施来减少内存冲突,例如使用缓存技术、避免频繁的内存分配和释放等。
参考GPT和自己的思路:
根据您的描述,您在使用图像批处理函数时遇到了内存冲突问题。这可能是由于内存泄漏或内存错误导致的。
以下是一些可能的解决方案:
检查代码中是否存在内存泄漏或内存错误。您可以使用内存分析工具来检查代码中的问题。Visual Studio自带了一个内存调试器,您可以使用它来检查内存问题。
尝试在代码中使用动态分配内存。这样可以避免内存冲突问题,并使代码更容易维护。使用new和delete操作符可以在运行时动态分配和释放内存。
尽量减少图像批处理的使用,以减少内存冲突的概率。您可以尝试优化代码,使用更少的图像批处理函数,或者考虑使用其他库来实现您的游戏。
希望这些解决方案对您有帮助!