Четверг, 28.03.2024, 13:55
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Категории каталога
BlitzMax [14]
Blitz3D [9]
BlitzPlus [0]
Xna [1]
DarkBasic [0]
Общее [3]
Наш опрос
Hans Zimmer - что это для вас?
1. Где?
2. Композитор вроде
3. Простые символы
4. Любимый композитор
5. Я не определился
Всего ответов: 12
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Статьи
Главная » Статьи » Blitz3D

Стабилизация FPS в играх.
Практически во всех программах написанных на Blitz3D, которые мне довелось встретить, есть одна и та же проблема. Они работают либо слишком быстро (в результате чего все события происходят практически мгновенно и среагировать нереально), либо слишком медленно (сильно растягивая все движения в игре). Изредка попадались такие проги, которые работали более-менее нормально.
Мне известны 2 способа решения этой проблемы.
Первый способ - сделать статичным количество обновлений цикла в секунду, то есть больше чем, например, 50 повторений цикла в секунду быть не должно. Однако просто поставить счетчик и не давать коду цикла выполнятся после достижения 50-ого повторения, обнуляя каждую секунду параметр счетчика, нельзя. Это вполне может (и, скорее всего так и будет) сделать игру скачкообразной, т.к. все передвижения и обновления экрана будут происходить в начале секунды, а оставшееся время ничего не происходит.
Для решения этой проблемы нужно в конце цикла поставить явную задержку, то есть в конце цикла программа должна задержаться на 1/50 секунды минус время, затраченное на исполнение программы.
Второй способ - это сделать все передвижения в игре привязанными к скорости исполнения программы. Таким образом, чем слабее машина у пользователя, тем менее гладко у него будет работать прога. Суть этого способа в том, что вместо задавания моментной скорости (расстояние, на которое передвигается объект каждый проход цикла на данной машине, и работающая правильно) писать секундную скорость (расстояние преодолимое за 1 секунду на любой машине) деленную на степень уменьшения. Далее каждый раз, определяя скорость исполнения кода, прога должна вычислять степень уменьшения секундной скорости.
Приведу пример:

While Not KeyDown( 1 )
  
old=MilliSecs(); сохранение в переменной времени до начала кода     

Код программы.
If KeyDown( 200 )=True Then MoveEntity cam,0,0,10 / Stp; Пример движения     

UpdateWater()
RenderWorld
UpdateWorld
Flip     

now=MilliSecs()-old; Определение времени исполнения программы
Stp=1000/now; Вычисление степени уменьшения секундной скорости     

Wend

Как видите, все очень просто - в код нужно добавлять всего-навсего несколько дополнительных строчек. Только может потребоваться подправить их под вашу прогу, но принцип остается тот же. Надеюсь, я понятно изложил свою мысль .


Источник: http://www.igrostroenie.my1.ru/publ/29-1-0-17
Категория: Blitz3D | Добавил: JohnK (30.06.2007) | Автор: Ivin
Просмотров: 3162 | Комментарии: 1
Всего комментариев: 1
1 PackegerX  
0
а если у меня выше 1000 фпс оно не работает)

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright JohnK© 2024