首先,让我澄清一些事情:
- 我的显示器是 60 赫兹
- 我将我的 FPS 限制为 60,它似乎工作正常
- 我激活了双缓冲标志
- 我自己做了一个后缓冲区,并确保绘制到它,然后绘制到屏幕上
- 这个问题在全屏和窗口模式下都会发生
这是我的主要功能(它包含所有代码):
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface * backbuffer = NULL;
SDL_Surface * screen = NULL;
SDL_Surface * box = NULL;
SDL_Surface * background = NULL;
SDL_Rect * rect = new SDL_Rect();
double FPS = 60;
double next_time;
bool drawn = false;
rect->x = 0;
rect->y = 0;
screen = SDL_SetVideoMode(1920, 1080, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
if(screen == NULL) {
return 0;
}
background = SDL_LoadBMP("background.bmp");
box = SDL_LoadBMP("box.bmp");
if((background == NULL) || (box == NULL)) {
return 0;
}
background = SDL_DisplayFormat(background);
box = SDL_DisplayFormat(box);
backbuffer = SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN,
1920,
1080,
32,
0,
0,
0,
0);
if(backbuffer == NULL) {
return 0;
}
next_time = (double)SDL_GetTicks() + (1000.0 / FPS);
while(true) {
if(!drawn) {
SDL_BlitSurface(background, NULL, backbuffer, NULL);
SDL_BlitSurface(box, NULL, backbuffer, rect);
rect->x += 3;
drawn = true;
}
if((Uint32)next_time <= SDL_GetTicks()) {
SDL_BlitSurface(backbuffer, NULL, screen, NULL);
SDL_Flip(screen);
next_time += 1000.0 / FPS;
drawn = false;
}
}
SDL_FreeSurface(backbuffer);
SDL_FreeSurface(background);
SDL_FreeSurface(box);
SDL_FreeSurface(screen);
SDL_Quit();
return 0;
我知道这段代码看起来不太好,这只是一个测试,看看为什么每当我在 SDL 中编写任何东西时都会发生这种情况。
请忽略丑陋的代码,如果您知道是什么可能导致黑色背景上移动的白色方块的图像出现奇怪的伪影并且似乎撕裂/口吃,请告诉我。
如果您需要更多信息,请告诉我,我会更新需要的信息。
编辑:
如果我不限制我的 FPS,它会以 200-400 fps 运行,这可能意味着 SDL_Flip 不等待屏幕刷新。
我不知道我写的标志是否真的被使用了。
我检查了我的标志,似乎我无法获得 SDL_HWSURFACE 和 SDL_DOUBLEBUF 标志。可能会导致问题?