Я написал корутины для своего игрового движка, а потом не стал их использовать
Я создал систему корутин на базе генераторов для своего игрового движка. В ней было 122 строки кода и 12 тестов. Она решила проблему «ада колбэков» (callback hell) и сделала скрипты линейными.
Затем я решил не использовать её для игровой логики. Вместо этого я выбрал конечный автомат (Finite State Machine, FSM).
Вот почему.
Большинство туториалов игнорируют две огромные проблемы использования генераторов в играх реального времени: память и сохранение.
- Memory Pressure
Каждый раз, когда вы вызываете
.next()у генератора, движок JavaScript создает новый объект. Этот объект содержит текущее значение и статус.
В игровом цикле, работающем при 60 FPS, это создает постоянную нагрузку на сборщик мусора (garbage collection). Мой движок следует правилу «нулевых аллокаций» (zero-allocation) для поддержания стабильной производительности. Генераторы нарушают это правило: они создают поток мелких объектов в каждом кадре.
- 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
