Паттерны программирования игр
— Паттерны очередности
167
Пример кода
Для такого длинного вступления код игрового цикла
действительно прост. Мы рассмотрим пару вариантов,
а затем быстро пробежимся по их достоинствам и недо-
статкам.
Игровой цикл управляет ИИ, рендерингом и други-
ми системами игры, но это выходит за рамки сути са-
мого паттерна, так что в примерах будем просто вызы-
вать фиктивные методы. Действительная реализация
render()
,
update()
и других будет домашним (слож-
ным!) заданием для читателя.
Беги, беги со всех ног
Мы уже видели реализацию простейшего игрового ци-
кла:
while (true)
{
processInput();
update();
render();
}
Его главная проблема в том, что вы не можете кон-
тролировать скорость игры. На быстрых компьютерах
цикл будет выполняться молниеносно — пользователи
даже не успеют осознать происходящее. А на медленных
компьютерах игра станет зависать. А уж если какая-то
часть игры перенасыщена событиями или в ней больше
используется ИИ или физика, то она будет идти значи-
тельно медленнее, чем другие.
Вздремните
Первый вариант, который мы рассмотрим, предлага-
ет весьма простое решение. Скажем, вы хотите, чтобы
игра постоянно работала на 60 FPS (примерно 16 мил-
лисекунд на каждый кадр). До тех пор пока вы можете
уложить вычислительные процессы и рендеринг в это
1000 мс/FPS = мс на кадр
168
Игровой цикл (Game Loop) —
Паттерны программирования игр
время, скорость смены кадров будет постоянной. Вам
остается только обработать кадр, а затем
подождать
указанное время, прежде чем обрабатывать следующий,
примерно так (рис. 9.1).
Рис. 9.1.
Чертовски простой игровой цикл
Код будет выглядеть примерно так:
while (true)
{
double start = getCurrentTime();
processInput();
update();
render();
sleep(start + MS_PER_FRAME -
getCurrentTime());
}
Вызов
sleep()
гарантирует, что игра не станет ра-
ботать слишком
быстро
при слишком быстрой обработ-
ке кадров. Но это не поможет, если игра будет слишком
медленной
. Если потребуется больше, чем 16 миллисе-
кунд на обработку одного кадра, то временная задержка
даст
отрицательный
эффект. Если бы компьютеры мог-
ли путешествовать назад во времени, все было бы на-
много проще, но увы.
Игра просто замедляется. Вы можете, конечно, умень-
шить количество вычислений за кадр — уменьшить ка-
чество графики или сделать искусственный интеллект
чуть менее интеллектуальным. Но такие изменения по-
влияют на качество игры для всех пользователей, даже
тех, чьи компьютеры достаточно мощные.
Do'stlaringiz bilan baham: |