Готовый перевод 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

Настройки

Готово:

17.86% КП = 1.0

Непереведённые фрагменты будут пропущены.