2013-12-17 2 views
0

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

  1. Мой монитор находится в 60 герц
  2. I довершение мой FPS до 60, и это, кажется, работает правильно
  3. у меня есть двойной флаг буферную активный
  4. Я сделал BackBuffer сам, и сделал так, чтобы привлечь к нему, а затем на экран
  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.

Пожалуйста, игнорируйте уродливый код и дайте мне знать, если у вас есть представление о том, что может заставлять изображение движущегося белого квадрата на черном фоне иметь странные артефакты и казаться, что оно разрывается/заикается.

Если вам нужна дополнительная информация, дайте мне знать, и я обновлю, что нужно.

EDIT:

  • Если я не довершение мой FPS, он работает на 200-400 кадров в секунду, что, вероятно, означает, SDL_Flip не дожидаясь обновления экрана.

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

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

+0

Как вам ограничить частоту кадров до 60? – Raxvan

+0

@ Raxvan Это в исходном коде ... –

+1

На самом деле, я вижу это сейчас, какую частоту кадров вы получаете, когда вы удаляете ограничение fps? Мне интересно, потому что мой ответ будет основан на результате :) – Raxvan

ответ

1

SDL Double buffering on HW_SURFACE

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

SDL_putenv("SDL_VIDEODRIVER=directx"); 

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

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

+0

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

Смежные вопросы