Ho creato le coroutine per il mio motore di gioco, poi non le ho usate

Ho creato un sistema di coroutine basato su generatori per il mio motore di gioco. Aveva 122 righe di codice e 12 test. Risolveva il problema del callback hell. Rendeva gli script simili a linee rette.

Poi ho scelto di non usarlo per la logica di gioco. Ho usato invece una Macchina a Stati Finiti (FSM).

Ecco perché.

La maggior parte dei tutorial ignora due problemi enormi legati ai generatori nei giochi in tempo reale: la memoria e il salvataggio.

  1. Pressione sulla memoria Ogni volta che chiami .next() su un generatore, il motore JavaScript crea un nuovo oggetto. Questo oggetto contiene il valore corrente e lo stato.

In un game loop che gira a 60 FPS, questo crea una pressione costante sulla garbage collection. Il mio motore segue una regola di zero-allocation per mantenere le prestazioni stabili. I generatori violano questa regola. Creano un flusso di piccoli oggetti ad ogni singolo frame.

  1. Il problema della serializzazione Un gioco deve poter salvare e caricare. È necessario trasformare lo stato attuale del gioco in dati e viceversa.

Non è possibile serializzare un generatore in pausa. Il suo stato risiede in slot interni del motore a cui non è possibile accedere. Se provi a salvarlo, otterrai un oggetto vuoto o un errore.

Una Macchina a Stati Finiti è diversa. Lo stato è semplicemente una stringa su un componente.

  • Per salvare: Scrivi la stringa su disco.
  • Per caricare: Leggi la stringa e dì alla FSM di iniziare da lì.

La FSM ha vinto perché gestisce le due cose che contano per un gioco professionale: prestazioni e persistenza.

Come scegliere:

La logica si trova all'interno del loop principale dei frame?

  • No: Usa una coroutine basata su generatore. Sono ottime per flussi una tantum, come il caricamento degli asset o l'onboarding.
  • Sì: Passa alla domanda successiva.

Lo stato deve sopravvivere a un salvataggio?

  • Sì: Usa una Macchina a Stati Finiti.
  • No: Passa alla domanda successiva.

Stai eseguendo molte sequenze contemporaneamente?

  • Sì: Usa una Macchina a Stati Finiti.
  • No: Usa una coroutine basata su generatore.

I generatori non sono un errore. Sono solo lo strumento sbagliato per il hot path. Usali come collante asincrono, ma usa le FSM per la logica di gioco.

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