SDL изображение разрывается / заикается

0

Прежде всего, позвольте мне сделать некоторые вещи ясными:

  1. Мой монитор составляет 60 герц
  2. Я закрываю свой FPS до 60, и кажется, что он работает правильно
  3. У меня двойной флаг буферизации
  4. Я сам сделал бэкбуффер и убедился в том, чтобы нарисовать его, а затем на экран
  5. Эта проблема возникает как в полноэкранном, так и в оконном режимах

Это моя основная функция (она содержит весь код):

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 кадров в секунду, что, вероятно, означает, что SDL_Flip не ждет обновления экрана.

  • Я не знаю, используются ли флаги, которые я пишу.

  • Я проверил свои флаги, и кажется, что я не могу получить флаги SDL_HWSURFACE и SDL_DOUBLEBUF. Это может вызвать проблему?

  • 0
    как вам ограничить частоту кадров до 60?
  • 0
    @Raxvan Это в исходном коде ...
Показать ещё 5 комментариев
Теги:
image
sdl
double-buffering

1 ответ

1

SDL Двойная буферизация на HW_SURFACE

Это решение моей проблемы. Все, что мне нужно было сделать, это добавить эту строку:

SDL_putenv("SDL_VIDEODRIVER=directx");

Спасибо за комментарии, они помогли мне найти решение. : D

Думаю, я должен проверить SDL 2.0 тоже...

  • 0
    Обратите внимание, что это не гарантирует HW_SURFACE в каждой системе. Если вам нужен настоящий аппаратный контроль, используйте opengl.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню