Passa l'evento tra i sistemi in un sistema Entity-Component multi-thread

2

C'è un modo per passare Eventi tra Sistemi in un Entity-Component-System multi-thread che realizza i benefici del salvataggio sulle risorse di sistema?

Ho letto un articolo tedesco sul modello di progettazione di Entity-Component-System. In questo articolo, l'autore ha scritto, che sarebbe bene lasciare che i sistemi comunichino tramite Eventi l'uno con l'altro. Quindi, se CollisionSystem attiva un evento CollisionEvent quando è presente un'entità scontrato con un altro SoundSystem può riprodurre un suono.

L'ho implementato con il modello Observer: un EventManager riceve eventi dai sistemi e notifica a tutti i sistemi. Quindi i sistemi possono apparire autonomamente se vogliono reagire a quell'evento.

Usando questo sistema basato su eventi posso risparmiare un sacco di potenza del computer. Un sistema fa qualsiasi cosa se deve fare. L'autore dell'articolo ha anche scritto che, a causa di tale incapsulamento da parte dei sistemi, è possibile inserire ogni sistema nel proprio thread.

Ho cercato di implementare questo comportamento, ma ho notato che se il sistema A lancia un evento e il sistema B reagisce su questo evento perché è un aggiornamento, il metodo viene chiamato da EventManager, l'azione viene chiamata nel thread del sistema A.

L'unica soluzione che mi viene in mente è di avere un loop all'interno di ogni sistema che guarda in una frequenza fissa attraverso una coda di eventi e se trova un evento interessante spara l'azione da solo. In questo modo perderei il mio Pattern di Osservatore e non salverei la potenza del computer.

    
posta Jonas Rudolph 23.09.2014 - 17:50
fonte

1 risposta

2

Il modello di osservatore non si adatta qui. Gli osservatori vengono chiamati in modo sincronico e devono terminare prima che il chiamante possa procedere. Quello che vuoi è il Actor Model - che, come hai detto tu, usa le code degli eventi. Non devi però occupartene, ci sono modi più efficienti per farlo, come far aspettare i thread sulle code degli eventi.

    
risposta data 23.09.2014 - 19:04
fonte

Leggi altre domande sui tag