I Built Coroutines for My Game Engine, Then Didn't Use Them

Zbudowałem system korutyn oparty na generatorach dla mojego silnika gry. Miał 122 linie kodu i 12 testów. Rozwiązywał problem „callback hell”. Dzięki niemu skrypty wyglądały jak proste linie.

Potem zdecydowałem, że nie będę go używać w logice gry. Zamiast tego użyłem automatu skończonego (Finite State Machine – FSM).

Oto dlaczego.

Większość poradników ignoruje dwa ogromne problemy z generatorami w grach czasu rzeczywistego: pamięć i zapisywanie stanu.

  1. Memory Pressure Za każdym razem, gdy wywołujesz .next() na generatorze, silnik JavaScript tworzy nowy obiekt. Obiekt ten zawiera aktualną wartość i status.

W pętli gry działającej w 60 FPS powoduje to ciągłą presję na mechanizm garbage collection. Mój silnik przestrzega zasady zero-allocation, aby utrzymać stabilną wydajność. Generatory łamią tę zasadę. Tworzą strumień małych obiektów w każdej klatce.

  1. The Serialization Problem Gra musi umożliwiać zapisywanie i wczytywanie stanu. Musisz przekształcić aktualny stan gry w dane i z powrotem.

Nie można zserializować wstrzymanego generatora. Jego stan znajduje się w wewnętrznych slotach silnika, do których nie masz dostępu. Jeśli spróbujesz go zapisać, otrzymasz pusty obiekt lub błąd.

Automat skończony (FSM) działa inaczej. Stan to po prostu ciąg znaków (string) w komponencie.

  • Aby zapisać: Zapisz ciąg na dysku.
  • Aby wczytać: Odczytaj ciąg i powiedz FSM, aby zaczął od tego stanu.

FSM wygrał, ponieważ radzi sobie z dwiema rzeczami, które są kluczowe dla profesjonalnej gry: wydajnością i trwałością danych (persistence).

How to choose:

Czy logika znajduje się w głównej pętli klatek?

  • Nie: Użyj korutyny opartej na generatorze. Są świetne do jednorazowych procesów, takich jak ładowanie zasobów czy onboarding.
  • Tak: Zadaj następne pytanie.

Czy stan musi zostać zachowany po zapisie gry?

  • Tak: Użyj automatu skończonego (FSM).
  • Nie: Zadaj następne pytanie.

Czy uruchamiasz wiele sekwencji jednocześnie?

  • Tak: Użyj automatu skończonego (FSM).
  • Nie: Użyj korutyny opartej na generatorze.

Generatory nie są błędem. Są po prostu niewłaściwym narzędziem do tzw. hot path. Używaj ich jako asynchronicznego kleju (async glue), ale do logiki gry używaj FSM.

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