0xdeadc0de
> Если события нет - возвращается ноль и весь цикл отрисовки пропускается.
В честь какого праздника он пропускается, если отрисовка вне блока if? Кривые отступы - это уже совсем другая тема, не заслуживающая внимания.
И даже если бы он пропускался - значение в счётчике кадров тогда должно было взлететь до запредельных высот.
zajac
SDL_Surface* hello = NULL; hello = SDL_LoadBMP("smile.bmp" )
После этих строк добавь преобразование рисунка в формат экрана:
SDL_Surface* old = hello; hello = SDL_DisplayFormat(old); SDL_FreeSurface( old);
Для максимальной скорости вывода нужно использовать OpenGL режим.
И еще несколько замечаний:
1.
if (SDL_PollEvent( &event))
Как уже сказали, не if, а while
2.
SDL_BlitSurface(hello, NULL, screen, NULL ); SDL_Flip( screen );
Добавь еще одну строку:
SDL_Delay(1);
Это снижает нагрузку на процессор (нужно на ноутбуках, чтобы экономить батарейки).
3.
SDL_FreeSurface(screen );
4. Так верстают пишут только мудаки быдлокодеры, следи за отступами:
while (gameRunning) { drawFps( &last_time, &output); if ( SDL_PollEvent( &event)) { if ( event.type == SDL_QUIT) { gameRunning = false; } } SDL_BlitSurface( hello, NULL, screen, NULL ); SDL_Flip( screen ); } SDL_FreeSurface( hello ); SDL_FreeSurface( screen ); SDL_Quit( ); return 0;
Короче, вот исправленный код:
int main(int argc, char **argv) { SDL_Init( SDL_INIT_VIDEO ); SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 0, SDL_HWSURFACE | SDL_DOUBLEBUF ); SDL_WM_SetCaption( WINDOW_TITLE, 0 ); SDL_Event event; bool gameRunning = true; unsigned int last_time = SDL_GetTicks( ); int output = 0; SDL_Surface* hello = NULL; hello = SDL_LoadBMP( "smile.bmp" ); SDL_Surface* old = hello; hello = SDL_DisplayFormat( old ); SDL_FreeSurface( old ); while ( gameRunning) { drawFps( &last_time, &output ); while ( SDL_PollEvent( &event )) { if ( event.type == SDL_QUIT) { gameRunning = false; } } SDL_BlitSurface( hello, NULL, screen, NULL ); SDL_Flip( screen ); SDL_Delay( 1 ); } SDL_FreeSurface( hello ); SDL_Quit( ); return 0; }
> SDL_VIDEODRIVER - не стоит в переменных вообще. Почитал, что дефолтный должен быть x11. Если поставить такой руками - изменений нет. Собственно, у меня X сервер и стоит.
Попробуй значение dga. Здесь говорят, что скорость должна возрасти, но у меня (на gf4mx) просто вылетает с Segmentation Fault.
DGA в лучшие времена работал только в фуллскрине. Теперь уже не работает нигде, наверно.
не хватает while у SDL_PollEvent(&event)
нужно сначала отработать максимум сообщений, а потом уже делать отрисовку
keltar
>если отрисовка вне блока if?
Ох черт. Точно, там кривой отступ. Мне показалось, что отрисовка в цикле.
Да, тогда всё ок
Хех. Извините за отступы. При копировании сбились.
Скомпилировал в винде. Выдает 106 FPS. Значит ли это, что проблема связана с дровами в линухе?
Если SWSURFACE настолько быстрее HWSURFACE - это косяк. Да и по фреймрейту больше похоже на vesa драйвер. На 640x480 не должно быть таких провалов.
Про SDL_DisplayFormat дело говорят, попробуй его тоже. Не забывай только, что он создаёт новый surface - старый надо удалить.
Для прикола запусти какой-нибудь battle for wesnoth, посмотреть на фреймрейт.
zajac
> Значит ли это, что проблема связана с дровами в линухе?
Возможно. Попробуй выключить вертикальную синхронизацию (VSync) в настройках видеокарты, это должно повысить FPS.
Конфигурационный файл /etc/x11/xorg.conf, секция "Monitor", строка Modeline для нужного графического режима, флаг +vsync включает, а -vsync выключает вертикальную синхронизацию.
У меня в секции "Monitor" нет этой строки:
Section "Monitor" #DisplaySize 340 270 # mm Identifier "Monitor0" VendorName "GSM" ModelName "" HorizSync 30.0 - 83.0 VertRefresh 56.0 - 75.0 Option "DPMS" EndSection
Не уверен, но возможно это проблема kernel'а: http://bbs.archlinux.org/viewtopic.php?id=96030
Тоже radeon, тоже xf86-video-ati и тоже SDL.
Запустил battle for wesnoth.
14-50 FPS
Тема в архиве.