Я створив корутини для свого ігрового рушія, а потім не став їх використовувати
Я розробив систему корутин на базі генераторів для свого ігрового рушія. Вона складалася зі 122 рядків коду та 12 тестів. Вона вирішувала проблему «пекла колбеків» (callback hell). Завдяки їй скрипти виглядали як прямі лінії.
Потім я вирішив не використовувати її для ігрової логіки. Замість цього я обрав скінченний автомат (Finite State Machine, FSM).
Ось чому.
Більшість туторіалів ігнорують дві величезні проблеми з генераторами в іграх реального часу: пам'ять та збереження.
- Навантаження на пам'ять
Щоразу, коли ви викликаєте
.next()у генератора, рушій JavaScript створює новий об'єкт. Цей об'єкт містить поточне значення та статус.
У ігровому циклі, що працює при 60 FPS, це створює постійне навантаження на збирач сміття (garbage collection). Мій рушій дотримується правила «нульового виділення пам'яті» (zero-allocation), щоб підтримувати стабільну продуктивність. Генератори порушують це правило. Вони створюють потік маленьких об'єктів у кожному кадрі.
- Проблема серіалізації Грі потрібно зберігати та завантажувати дані. Вам потрібно перетворювати поточний стан гри на дані й навпаки.
Ви не можете серіалізувати призупинений генератор. Його стан зберігається у внутрішніх слотах рушія, до яких ви не маєте доступу. Якщо ви спробуєте його зберегти, ви отримаєте порожній об'єкт або помилку.
Скінченний автомат працює інакше. Стан — це просто рядок у компоненті.
- Щоб зберегти: запишіть рядок на диск.
- Щоб завантажити: прочитайте рядок і накажіть FSM почати з нього.
FSM переміг, тому що він вирішує дві речі, які є критичними для професійної гри: продуктивність та збереження стану (persistence).
Як обрати:
Чи знаходиться логіка всередині основного циклу кадрів?
- Ні: Використовуйте корутину-генератор. Вони чудово підходять для одноразових процесів, таких як завантаження асетів або онбординг.
- Так: Перейдіть до наступного запитання.
Чи має стан зберігатися при збереженні гри?
- Так: Використовуйте скінченний автомат (FSM).
- Ні: Перейдіть до наступного запитання.
Ви запускаєте багато послідовностей одночасно?
- Так: Використовуйте скінченний автомат (FSM).
- Ні: Використовуйте корутину-генератор.
Генератори — це не помилка. Це просто не той інструмент для «гарячих шляхів» (hot path). Використовуйте їх як «асинхронний клей», але для ігрової логіки обирайте FSM.
Джерело: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g
