Приветствую Вас Гость | Зарегистрироваться | Вход | RSS

Поиск по сайту:
Поиск в интернете:
Главная » Статьи » Учебники по 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

Как видите, все очень просто - в код нужно добавлять всего-навсего несколько дополнительных строчек. Только может потребоваться подправить их под вашу прогу, но принцип остается тот же. Надеюсь, я понятно изложил свою мысль .
Категория: Учебники по Blitz3d | Добавил: blitz3d-portal (08.Декабрь.04) E W
Просмотров: 1924 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]