Я написал корутины для своего игрового движка, а потом не стал их использовать

Я создал систему корутин на базе генераторов для своего игрового движка. В ней было 122 строки кода и 12 тестов. Она решила проблему «ада колбэков» (callback hell) и сделала скрипты линейными.

Затем я решил не использовать её для игровой логики. Вместо этого я выбрал конечный автомат (Finite State Machine, FSM).

Вот почему.

Большинство туториалов игнорируют две огромные проблемы использования генераторов в играх реального времени: память и сохранение.

  1. Memory Pressure Каждый раз, когда вы вызываете .next() у генератора, движок JavaScript создает новый объект. Этот объект содержит текущее значение и статус.

В игровом цикле, работающем при 60 FPS, это создает постоянную нагрузку на сборщик мусора (garbage collection). Мой движок следует правилу «нулевых аллокаций» (zero-allocation) для поддержания стабильной производительности. Генераторы нарушают это правило: они создают поток мелких объектов в каждом кадре.

  1. The Serialization Problem Игре нужно сохраняться и загружаться. Вам необходимо превращать текущее состояние игры в данные и обратно.

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

Конечный автомат работает иначе. Его состояние — это просто строка в компоненте.

  • Чтобы сохранить: запишите строку на диск.
  • Чтобы загрузить: прочитайте строку и скажите FSM начать с этого состояния.

FSM победил, потому что он решает две вещи, критически важные для профессиональной игры: производительность и персистентность (сохранение состояния).

How to choose:

Логика находится внутри основного игрового цикла?

  • Нет: используйте корутину-генератор. Они отлично подходят для разовых процессов, таких как загрузка ассетов или обучение (onboarding).
  • Да: задайте следующий вопрос.

Должно ли состояние сохраняться при записи игры?

  • Да: используйте конечный автомат (FSM).
  • Нет: задайте следующий вопрос.

Вы запускаете много последовательностей одновременно?

  • Да: используйте конечный автомат (FSM).
  • Нет: используйте корутину-генератор.

Генераторы — это не ошибка. Они просто неподходящий инструмент для «горячих путей» (hot path). Используйте их как «асинхронный клей», но для игровой логики используйте FSM.

Source: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g