Ci sono due cose distinte da considerare quando si misura e si ottimizzano le prestazioni di un sistema di entità così ampio.
A basso livello, hai la rappresentazione fisica delle tue entità che tende a ridursi all'utilizzo di layout di archiviazione efficienti come SoA (strutture di array) per ridurre i costi di iterazione e aggiornamento di tutte le entità attive.
Al livello superiore, hai la logica del processo decisionale, la logica generale del gioco, l'intelligenza artificiale e il pathfinding. Queste sono tutte attività che hanno in comune il fatto che non devono essere eseguite alla stessa velocità di aggiornamento del rendering.
Dato che si otterrebbe un tempo di frame irregolare se si adotta l'approccio ingenuo di svolgere tali compiti ogni N frame, tende ad essere utile ammortizzare il costo su più frame.
Se l'attività ha natura incrementale, è possibile eseguire parte dell'algoritmo in ogni frame e utilizzare risultati parziali negli aggiornamenti.
Se l'attività è in gran parte monolitica ma separabile per entità, è possibile eseguire tale attività per un sottoinsieme delle entità di gioco per fotogramma, ruotando tra loro in modo circolare. Questo ha il vantaggio di ridurre la complessità di cose come l'individuazione di percorsi e l'intelligenza artificiale, dato che non tutti hanno tentato di agire contemporaneamente.
Nel RTS tattico su larga scala su cui ho lavorato, ci siamo concentrati sull'avere strutture dati robuste per interrogare la rappresentazione di basso livello negli algoritmi di alto livello, per trovare i vicini di entità di gioco. Il processo di aggiornamento di basso livello ha agito sugli intenti forniti dalla simulazione di alto livello ad aggiornamento lento e alla fine si è ridotto a una simulazione di particelle a basso costo, scalando bene a migliaia.