Avere elenchi locali per ciascun sistema aumenterà l'utilizzo della memoria per le classi.
È un tradizionale compromesso spazio-temporale .
Mentre scorrere tutte le entità e controllare le loro firme è direttamente codificato, può diventare inefficiente man mano che il tuo numero di sistemi cresce - immagina un sistema specializzato (lascia che sia input) che cerchi la sua probabilmente singola entità di interesse tra migliaia di entità non correlate .
Detto questo, questo approccio può ancora essere abbastanza buono a seconda dei tuoi obiettivi.
Tuttavia, se sei preoccupato per la velocità, ci sono ovviamente altre soluzioni da considerare.
Ogni sistema dovrebbe contenere un elenco locale di entità a cui sono interessati?
Esattamente. Questo è un approccio standard che dovrebbe offrire prestazioni decenti ed è ragionevolmente facile da implementare. Il sovraccarico di memoria è trascurabile secondo me - stiamo parlando di memorizzare i puntatori.
Ora come mantenere questi "elenchi di interessi" potrebbe non essere così ovvio. Per quanto riguarda il contenitore di dati, std::vector<entity*> targets
all'interno della classe di sistema è perfettamente sufficiente. Ora quello che faccio è questo:
La rimozione di un'entità è del tutto analoga, con l'unica differenza che rimuoviamo se un sistema corrisponde alla nostra firma corrente (il che significa che l'entità era lì) e non corrisponde alla nuova firma (il che significa che l'entità non dovrebbe più essere lì ).
Ora potresti prendere in considerazione l'utilizzo di std :: list perché la rimozione dal vettore è O (n), senza menzionare che dovresti spostare grandi quantità di dati ogni volta che rimuovi dal centro. In realtà, non è necessario, poiché non ci interessa elaborare l'ordine a questo livello, possiamo semplicemente chiamare std :: remove e vivere con il fatto che ad ogni eliminazione dobbiamo solo eseguire la ricerca O (n) per il nostro entità da rimuovere.
std :: list ti darebbe O (1) rimuovere ma dall'altra parte hai un po 'di memoria aggiuntiva. Ricorda anche che la maggior parte delle volte elaborerai le entità e non le rimuoverai - e questo sicuramente sarà fatto più velocemente usando std :: vector.
Se sei molto critico in termini di prestazioni, puoi prendere in considerazione anche un altro modello di accesso ai dati , ma in entrambi i casi mantieni un qualche tipo di "elenco di interessi". Ricorda, tuttavia, che se l'API di Entity System viene mantenuta abbastanza astratta, non dovrebbe essere un problema migliorare i metodi di elaborazione delle entità dei sistemi se il tuo framerate diminuisce a causa loro - quindi per ora, scegli il metodo più facile da codificare per te - solo quindi profilare e migliorare se necessario.