C++ SDL图像撕裂/口吃
首先,让我澄清一些事情:C++ SDL图像撕裂/口吃,c++,image,sdl,double-buffering,C++,Image,Sdl,Double Buffering,首先,让我澄清一些事情: 我的显示器的频率是60赫兹 我的FPS上限为60,它似乎工作正常 我激活了双缓冲标志 我自己做了一个后缓冲,并确保画到它,然后到屏幕上 此问题在全屏模式和窗口模式下都会发生 这是我的主要功能(它包含所有代码): SDL_Init(SDL_Init_EVERYTHING); SDL_表面*backbuffer=NULL; SDL_表面*屏幕=空; SDL_曲面*框=空; SDL_表面*背景=空; SDL_Rect*Rect=新的SDL_Rect(); 双FPS=60; 下
SDL_Init(SDL_Init_EVERYTHING);
SDL_表面*backbuffer=NULL;
SDL_表面*屏幕=空;
SDL_曲面*框=空;
SDL_表面*背景=空;
SDL_Rect*Rect=新的SDL_Rect();
双FPS=60;
下次加倍;
布尔值=假;
rect->x=0;
rect->y=0;
屏幕=SDL_设置视频模式(1920、1080、32、SDL_表面| SDL_双屏| SDL_全屏);
如果(屏幕==NULL){
返回0;
}
background=SDL_LoadBMP(“background.bmp”);
box=SDL_LoadBMP(“box.bmp”);
如果((背景==NULL)| |(框==NULL)){
返回0;
}
背景=SDL_显示格式(背景);
box=SDL_显示格式(box);
backbuffer=SDL_CreateRGB曲面(SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_全屏,
1920,
1080,
32,
0,
0,
0,
0);
if(backbuffer==NULL){
返回0;
}
下一次=(双精度)SDL_GetTicks()+(1000.0/FPS);
while(true){
如果(!绘制){
SDL_BlitSurface(背景,空,backbuffer,空);
SDL_BlitSurface(框、空、backbuffer、rect);
rect->x+=3;
绘制=真;
}
如果(Uint32)下次
这就是我问题的解决办法。
我所要做的就是添加这一行:
SDL_putenv("SDL_VIDEODRIVER=directx");
感谢您的评论,他们帮助我找到了解决方案。:D
我想我也应该检查一下SDL2.0…如何将帧速率限制在60?@Raxvan它在源代码中…实际上我现在可以看到,当您取消fps限制时,您得到的帧速率是多少?我很感兴趣,因为我的答案将基于结果:)你怎么知道你请求的视频标志被实际使用了?取消上限时为200-400 FPS,因此它可能不会等待SDL_Flip上的屏幕刷新,我也不知道这些标志是否被实际使用。请注意,这并不能保证每个系统上都有HW_表面。如果你想要真正的硬件控制,请使用opengl。
SDL_putenv("SDL_VIDEODRIVER=directx");