Sto lavorando su un sistema di componenti di entità per scopi didattici. Ho apportato importanti modifiche al mio design, quindi mi chiedevo se avrei potuto scegliere un design migliore per il mio sistema di eventi.
The purpose of the event system (if you don't know ECS), is to allow communication between process. For example, in a video game (that's always more easy to understand with video games) your collision system may want to tell to other system when there is a collision and with which entities.
Con questo piccolo contesto, il mio attuale design per il sistema degli eventi era più:
- Quando un evento viene emesso - > salvalo in event manager (ptr condiviso)
- Quindi chiama tutti gli iscritti e invia loro un ptr condiviso dei dati ( grazie a Bart van Ingen Schenau )
- All'interno del callback, salva l'evento in una coda per consumarlo sul prossima chiamata di aggiornamento
Ma gli eventi sono di sola lettura, quindi mi chiedo se qualcosa del genere non sarà migliore:
- Quando un evento viene emesso - > chiama ogni abbonato e invia loro una copia dell'evento
- All'interno del callback, spostare l'evento in una coda per consumarlo sul prossima chiamata di aggiornamento
I sistemi saranno multithreading (il che significa che almeno gli eventi possono essere emessi su qualsiasi thread).
Una delle parti più importanti del mio nuovo design, è che il sistema è "diviso" in blocchi (puoi vedere come diverse funzioni di aggiornamento). Ma gli eventi sono per l'intero sistema. Quindi le copie significheranno che avrò bisogno di una funzione di garbage collector per ogni sistema per liberare gli eventi che consumano. Beh, in effetti, ho ancora bisogno di questo con PTR condiviso.
Probabilmente ci sono molti altri design. Quindi, se pensi a qualcosa di buono per un ECS generico (non solo per i videogiochi), dove gli abbonati agli eventi tendono a raggrupparsi, dammi il tuo pensiero per favore.