ПрограммированиеФорумГрафика

Оптимизация FPS на старых машинах в SDL (2 стр)

Страницы: 1 2
#15
6:20, 3 июня 2010

0xdeadc0de
> Если события нет - возвращается ноль и весь цикл отрисовки пропускается.
В честь какого праздника он пропускается, если отрисовка вне блока if? Кривые отступы - это уже совсем другая тема, не заслуживающая внимания.
И даже если бы он пропускался - значение в счётчике кадров тогда должно было взлететь до запредельных высот.

#16
7:00, 3 июня 2010

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;
#17
7:14, 3 июня 2010

Короче, вот исправленный код:

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.

#18
11:22, 3 июня 2010

DGA в лучшие времена работал только в фуллскрине. Теперь уже не работает нигде, наверно.

#19
12:00, 3 июня 2010

не хватает while у SDL_PollEvent(&event)
нужно сначала отработать максимум сообщений, а потом уже делать отрисовку

#20
13:37, 3 июня 2010

keltar
>если отрисовка вне блока if?
Ох черт. Точно, там кривой отступ. Мне показалось, что отрисовка в цикле.
Да, тогда всё ок

#21
16:07, 3 июня 2010

Хех. Извините за отступы. При копировании сбились.

Скомпилировал в винде. Выдает 106 FPS. Значит ли это, что проблема связана с дровами в линухе?

#22
18:47, 3 июня 2010

Если SWSURFACE настолько быстрее HWSURFACE - это косяк. Да и по фреймрейту больше похоже на vesa драйвер. На 640x480 не должно быть таких провалов.
Про SDL_DisplayFormat дело говорят, попробуй его тоже. Не забывай только, что он создаёт новый surface - старый надо удалить.
Для прикола запусти какой-нибудь battle for wesnoth, посмотреть на фреймрейт.

#23
5:19, 4 июня 2010

zajac
> Значит ли это, что проблема связана с дровами в линухе?
Возможно. Попробуй выключить вертикальную синхронизацию (VSync) в настройках видеокарты, это должно повысить FPS.
Конфигурационный файл /etc/x11/xorg.conf, секция "Monitor", строка Modeline для нужного графического режима, флаг +vsync включает, а -vsync выключает вертикальную синхронизацию.

#24
11:29, 4 июня 2010

У меня в секции "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.

#25
13:49, 5 июня 2010

Запустил battle for wesnoth.
14-50 FPS

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.