SDL: проблемы FPS с простым растровым изображением - PullRequest
1 голос
/ 14 сентября 2010

В настоящее время я работаю над игрой в SDL, которая имеет разрушаемую местность.В настоящий момент ландшафт представляет собой одно большое (5000 * 500, для тестирования) растровое изображение, которое генерируется случайным образом.

В каждом кадре основная поверхность очищается, и растровое изображение ландшафта помещается в нем.Текущее разрешение составляет 1200 * 700, поэтому при тестировании 1200 * 500 пикселей были видны в большинстве точек.

Теперь проблема в том, что FPS уже падает!Я думал, что одно простое растровое изображение не должно показывать никакого эффекта - но я уже падаю до ~ 24 FPS с этим!

  • Почему блитдинг и рисование растрового изображения такого размера так медленно?
  • Использую ли я ложный подход на разрушаемой местности?

  • Как в таких играх, как Worms, это удалось?FPS кажется очень высоким, хотя там определенно нарисовано много пикселей

Ответы [ 3 ]

0 голосов
/ 25 октября 2010

Если вы перерисовываете весь экран в каждом кадре, у вас всегда будет плохой FPS.Вы должны перерисовать только часть экрана, которая изменилась.Вы также можете попробовать использовать SDL_HWSURFACE для использования аппаратного обеспечения, но оно не будет работать на каждой графической карте.

0 голосов
/ 25 октября 2010

2d в SDL довольно медленный, и мало что можно сделать, чтобы сделать его быстрее (по крайней мере, в Windows он по умолчанию использует GDI для рисования.) Возможны следующие варианты:

  1. Откройте opengl и начните использовать текстурированные квадраты для спрайтов.
  2. Попробуйте SFML. Это обеспечивает аппаратно ускоренную 2d среду.
  3. Использование SDL 1.3. Получите исходный моментальный снимок, который нестабилен и все еще находится в стадии разработки, но аппаратное ускорение 2d должно быть одним из главных преимуществ.
0 голосов
/ 20 сентября 2010

Всякий раз, когда вы инициализируете поверхность, делайте это следующим образом:

SDL_Surface* mySurface;
SDL_Surface* tempSurface;
tempSurface = SDL_LoadIMG("./path/to/image/image.jpg_or_whatever"); 
/* SDL_LoadIMG() is correct name? Not sure now, I`m at work, so I can`t verify it. */
mySurface = SDL_DisplayFormat(tempSurface);
SDL_FreeSurface(tempSurface);

Метод SDL_DisplayFormat () преобразует пиксельный формат вашей поверхности в формат, используемый видео-поверхностью.Если вы делаете это не так, как я описал выше, SDL делает это каждый раз, когда поверхность вспыхивает.

И всегда помните: просто поменяйте необходимые детали, которые действительно видны игроку.

Это мое первое предположение, почему у вас проблемы с производительностью.Разместите свой код или задайте более конкретные вопросы, если вы хотите больше подсказок.Удачи в вашей игре.

...