Готовый перевод Game Programming Patterns / Паттерны программирования в играх: 2.2. Game Loop
Цель
Сделать скорость игры независимой от производительности компьютера и ввода игрока.
Мотивация
Если и есть паттерн, без которого эта книга не обошлась бы, то это он.
(Главный) Игровой цикл это пример квинтэссенции "паттерна программирования игр". Он есть практически во всех играх, и при этом нет двух абсолютно одинаковых, и он даже иногда используется в не игровых программах.
Что бы увидеть насколько они полезны, давайте отправимся в небольшое путешествие по закоулкам памяти.
В стародавние времена компьютерного программирования, когда все носили бороды, программы работали также как посудомойка: загружаешь код, жмёшь кнопку, ждёшь, получаешь результат.
Дело сделано.
Это был пакетный режим выполнения: задача выполнена - программа остановилась.
У Ады Лавлейс (Ada Lovelace) и контр-адмирала Грейсa Хопперa (Grace Hopper) были почетные бороды.
И их ещё можно увидеть в наши дни, хотя мы, к счастью, больше не обязаны писать на перфокартах.
Сценарии оболочки (shell), программы коммандной строки и даже небольшие скритпы на Python которые ??переварачивают кучи из скидок?? в этой книге - все они программы пакетного выполнения.
Интервью с процессором
В конце концов, программисты осознали, что необходимость оставлять выполняющийся код в вычислительном офисе и возвращаться спустя несколько часов для получения результата это ужасно медленный способ выявления багов в программе.
Они хотели немедленную обратную связь.
Появились интерактивные программы.
while (true)
{
char* command = readCommand();
handleCommand(command)
;
}
while (true)
{
Event* event = waitForEvent();
dispatchEvent(event)
;
}
while (true)
{
processInput();
update();
render();
}
while (true)
{
processInput();
update();
render();
}
while (true)
{
double start = getCurrentTime();
processInput();
update();
render();
sleep(start + MS_PER_FRAME - getCurrentTime());
}
double lastTime = getCurrentTime();
while (true)
{
double current = getCurrentTime();
double elapsed = current - lastTime;
processInput();
update(elapsed)
;
render();
lastTime = current;
}
double previous = getCurrentTime();
double lag = 0.0;
while (true)
{
double current = getCurrentTime();
double elapsed = current - previous;
previous = current;
lag += elapsed;
processInput();
while (lag >= MS_PER_UPDATE)
{
update();
lag -= MS_PER_UPDATE;
}
render();
}
render(lag / MS_PER_UPDATE)
;
Переведено на Нотабеноиде
http://notabenoid.org/book/51192/215218
Переводчики: kabanov, Vladislav86, drdaemos, lilia2105
Настройки
Готово:
