Прежде всего, позвольте мне сделать некоторые вещи ясно:SDL изображение слезотечение/заикание
- Мой монитор находится в 60 герц
- I довершение мой FPS до 60, и это, кажется, работает правильно
- у меня есть двойной флаг буферную активный
- Я сделал BackBuffer сам, и сделал так, чтобы привлечь к нему, а затем на экран
- Эта проблема происходит как в полноэкранном режиме и оконном режиме
Это моя основная функция (она содержит весь код):
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.
Пожалуйста, игнорируйте уродливый код и дайте мне знать, если у вас есть представление о том, что может заставлять изображение движущегося белого квадрата на черном фоне иметь странные артефакты и казаться, что оно разрывается/заикается.
Если вам нужна дополнительная информация, дайте мне знать, и я обновлю, что нужно.
EDIT:
Если я не довершение мой FPS, он работает на 200-400 кадров в секунду, что, вероятно, означает, SDL_Flip не дожидаясь обновления экрана.
Я не знаю, используются ли флаги, которые я пишу, на самом деле.
Я проверил свои флаги, и кажется, что я не могу получить флаги SDL_HWSURFACE и SDL_DOUBLEBUF. Это может вызвать проблему?
Как вам ограничить частоту кадров до 60? – Raxvan
@ Raxvan Это в исходном коде ... –
На самом деле, я вижу это сейчас, какую частоту кадров вы получаете, когда вы удаляете ограничение fps? Мне интересно, потому что мой ответ будет основан на результате :) – Raxvan