Перейти к основному содержимому

Паттерны — игровой цикл и конечные автоматы

Разработчику

Игровой цикл (game loop) — повторяющаяся последовательность шагов, из которой складывается интерактивная графика. Каждый проход цикла — один кадр (frame).


Схема цикла

while (running):
dt = measure_delta_time()
process_input()
update(dt)
render()
sync_to_display()

Иллюзия движения — из серии статичных картинок, как в мультфильме.

Порядок шагов

  1. Input — прочитать клавиши и мышь в начале кадра
  2. Update — изменить модель с учётом dt
  3. Render — нарисовать актуальное состояние (часто после очистки холста)

Если вызвать render до update, на экране окажется кадр на один шаг старее логики.

Delta time (dt)

Delta time — время в секундах с прошлого кадра.

Формула x += vx * dt делает скорость независимой от FPS (частоты кадров). Без dt игра на 144 Гц движется быстрее, чем на 60 Гц.

Типичные ловушки:

  • слишком большой dt при лаге — объект "проскакивает" сквозь стену; ограничение dt = Math.min(dt, 0.05)
  • забытый dt на одной из осей

Синхронизация по платформам

ПлатформаМеханизмПримечание
БраузерrequestAnimationFrame~60 Гц, пауза во вкладке
Pygameclock.tick(60)блокирует до следующего слота
OpenGLglfwSwapBuffers, SDL_GL_SwapWindowопционально V-Sync
UnityUpdate()физика в FixedUpdate

Пример цикла — code-418-1-001, демо слоёв.

Fixed timestep

Физика иногда обновляется фиксированным шагом (1/60 с), рендер — с интерполяцией между двумя состояниями. Симуляция стабильнее при скачках FPS.


Порядок отрисовки кадра

clear entire framebuffer
draw background
draw world entities (sorted by z / layer)
draw particles
draw UI overlay
present / swap

Painter's algorithm — в 2D дальние объекты рисуют раньше ближних. В 3D перекрытие решает Z-buffer (буфер глубины).


Конечный автомат (FSM)

FSM (finite state machine) — явный список режимов игры и правил перехода между ними.

СостояниеUpdateRender
MENUнавигация по пунктамфон и кнопки
PLAYINGфизика, врагимир и HUD
PAUSEDтолько ввод "продолжить"замороженный мир и оверлей
GAME_OVERтаймер рестартаитоговый экран
switch (gameState) {
case 'MENU': updateMenu(); renderMenu(); break;
case 'PLAYING': updateWorld(); renderWorld(); break;
}

Плюсы FSM:

  • физика не запускается в меню
  • разные обработчики ввода на режим
  • проще тестировать

Иерархические FSM: внутри PLAYING — подсостояния CUTSCENE, DIALOG.

FSM и набор флагов

Вариант с if (paused) return в каждой функции быстро превращается в запутанный код. FSM задаёт карту режимов в одном месте.


Соседние паттерны

ПаттернРоль
Entity-Componentданные сущности разбиты на компоненты
Object Poolпереиспользование пуль без сборщика мусора
Stateобъект с enter, update, exit на состояние
Commandочередь действий ввода

Unity: MonoBehaviour.Update(), LateUpdate(). Godot: _process(delta).


Связи