Как работает игровая петля: простое объяснение для всех, кто делает или хочет делать игры

Game loop вкратце и доступно
Game loop вкратце и доступно

Даже если вы не пишете код, понимание game loop — это база. Именно здесь рождаются лаги, кривые тайминги, проблемы анимации и вопросы: «почему враг не реагирует» и «почему у меня всё трясётся».

И всё это можно объяснить очень просто.

Что такое game loop

Представьте себе игру как классическую тетрадь в клетку.

Каждая клеточка — это один кадр.

Внутри кадра игра должна:

  1. Принять ввод игрока (кнопки, мышь).
  2. Обновить всю логику (AI, перемещение, способности).
  3. Посчитать физику.
  4. Обновить анимации.
  5. Нарисовать картинку.

Потом — следующее. И так n раз в секунду, если у вас n FPS (также ФПС — Частота кадров в секунду).

Почему важно понимать, что не всё делается каждый кадр

Возможно, кто то подумает:

«Хочу, чтобы враг проверял игрока каждую секунду, значит поставлю таймер, и всё, изи».

Кто-то

Но это не так.

Если вы проверяете врага в Update(), то это происходит каждый кадр. А кадр не равно секунда. Это может быть 16 мс, 33 мс, 50 мс — зависит от ФПС.

Поэтому такой метод нам не подходит, слишком много вычислений в секунду, и, как следствие, большая нагрузка на железо.

Также, у всех разное железо, из этого следует множество проблем (ниже лишь парочка из них):

  • у кого-то враги думают слишком часто. а у кого-то тупят;

  • у кого-то способности откатываются в два раза медленнее, а у кого-то, соответственно, быстрее;

Зачем нужен дельта-тайм (и почему без него всё ломается)

Дельта-тайм — это сколько времени прошло между кадрами.

Например:

  • на мощном ПК кадры идут с интервалом 0.016 секунд;

  • на слабом — 0.040 секунд.

Если вы реализуете движение так:

position += speed;

то на слабом ПК персонаж будет двигаться медленнее. Потому что перемещение за кадр постоянное, а кадров меньше.

И тут дельта-тайм выходит на первый план:

position += speed * deltaTime;

И если сделать так, то перемещение зависит от времени между кадрами, а не от FPS, и все у нас двигаются одинаково.

⚠ Небольшое уточнение

deltaTime спасает, когда вы сами руками двигаете объект по формуле — без физики движка. Тогда да, скорость и анимации становятся независимыми от FPS.

Но если вы используете физику движка, одной дельты мало. Там важен ещё и фиксированный ритм расчётов — об этом как раз следующий блок.

FixedUpdate / Fixed Tick — что это и зачем

Что это вообще такое?

В игре есть два ритма жизни:

  1. Ритм кадров (Update) — идёт столько раз, сколько успевает железо. Может быть 120 раз/сек на мощном ПК, 40 раз/сек на старом ноуте.
  2. Ритм физики (FixedUpdate / Fixed Tick) — идёт строго фиксированно. Например, 50 раз в секунду всегда, независимо от FPS.

Почему нужен фиксированный ритм?

Потому что физика ломается, если зависит от ФПС.

Представьте прыжок персонажа:

  • В Update вы считаете прыжок 60 раз/сек у одного игрока.
  • И 35 раз/сек — у другого, ибо у него ФПС меньше из-за слабого пк.
  • Персонажи прыгают по-разному, потому что расчётов разное количество, вот вам и хаос.

Физика должна быть:

  • одинаковая на всех устройствах;
  • предсказуемая;
  • стабильная даже при просадках FPS.

Поэтому движки сделали отдельный ритм — FixedUpdate (Unity)/Fixed Tick (UE/Godot).

Простое правило:

  • всё, что связано с физикой (Rigidbody, гравитация, прыжки, столкновения) — обновляем в фиксированном тике;
  • всё, что связано с логикой, камерой, UI, эффектами — живёт в обычном Update и скейлится через deltaTime.

Почему изучение game loop улучшает жизнь даже у художника/дизайнера

Потому что вы перестаёте относиться к игре как к магическому чёрному ящику.

Вы начинаете понимать:

  • прорывы анимации — потому что логика и анимация отрабатывают в разные кадры;
  • лаги UI — тяжёлая логика в одном кадре блокирует рендер;
  • AI тупит — потому что проверка условий прописана через Update и зависима от FPS;
  • камера дёргается — из-за работы без дельта-тайма;
  • физика непредсказуема — потому что не в Fixed.

Это то, что экономит дни дебага, даже если вы лично не пишете код.

Простой тест: понимаете ли вы game loop

Ответьте себе на 5 вопросов:

  1. Прыжок персонажа считается в Update или Fixed?.
  2. Почему враг на слабом ПК реагирует на игрока реже?
  3. Что произойдёт, если убрать deltaTime?
  4. Почему UI может лагать, даже если сцена пустая?
  5. Может ли 10 ms действия в одном кадре уронить FPS до 30?

Если на 3+ вопросов ответили — вы уже понимаете эту тему лучше половины джунов, иначе — рекомендуем вернуться обратно к темам.

Мини итоги

Game loop — это сердце игры. Если вы понимаете, как оно бьётся, вы перестаёте делать наугад и начинаете собирать вещи осознанно: анимации, движение, AI, физику, способности, эффекты.

У нас всё, спасибо за прочтение.
Всем добра!

12
5 комментариев