Un po 'di background, sto programmando un gioco di evoluzione con un amico in C ++, usando ENTT per il sistema di entità. Le creature camminano in una mappa 2D, mangiano verdure o altre creature, si riproducono e i loro tratti mutano.
Inoltre, le prestazioni vanno bene (60 fps senza problemi) quando il gioco viene eseguito in tempo reale, ma voglio essere in grado di accelerare in modo significativo per non dover aspettare 4 ore per vedere eventuali cambiamenti significativi. Quindi voglio ottenerlo il più velocemente possibile.
Sto lottando per trovare un metodo efficiente per le creature per trovare il loro cibo. Ogni creatura dovrebbe cercare il miglior cibo che è abbastanza vicino a loro.
Se vuole mangiare, la creatura raffigurata al centro dovrebbe guardarsi attorno in un raggio di 149,64 (la sua distanza di vista) e giudicare quale cibo dovrebbe perseguire, che si basa su nutrizione, distanza e tipo (carne o pianta) .
La funzione responsabile di trovare ogni creatura il loro cibo sta consumando circa il 70% del tempo di esecuzione. Semplificando come è scritto attualmente, va qualcosa del genere:
for (creature : all_creatures)
{
for (food : all_entities_with_food_value)
{
// if the food is within the creatures view and it's
// the best food found yet, it becomes the best food
}
// set the best food as the target for creature
// make the creature chase it (change its state)
}
Questa funzione esegue ogni tick per ogni creatura in cerca di cibo, fino a quando la creatura non trova cibo e cambia stato. Viene inoltre eseguito ogni volta che vengono generati nuovi alimenti per le creature che inseguono già un determinato cibo, per assicurarsi che tutti vadano alla ricerca del miglior cibo disponibile.
Sono aperto alle idee su come rendere questo processo più efficiente. Mi piacerebbe ridurre la complessità di , ma non so se sia possibile.
Un modo per migliorarlo è quello di ordinare il all_entities_with_food_value
gruppo in modo tale che quando una creatura scorre il cibo troppo grande per essere mangiato, si ferma lì. Qualsiasi altro miglioramento è più che benvenuto!
EDIT: Grazie a tutti per le risposte! Ho implementato varie cose da varie risposte:
In primo luogo e semplicemente ho fatto in modo che la funzione colpevole funzioni solo una volta ogni cinque tick, questo ha reso il gioco circa 4 volte più veloce, senza cambiare visibilmente nulla del gioco.
Successivamente, ho archiviato nel sistema di ricerca degli alimenti un array con il cibo generato nella stessa spunta che corre. In questo modo ho solo bisogno di confrontare il cibo che la creatura sta inseguendo con i nuovi cibi che sono apparsi.
Infine, dopo una ricerca sul partizionamento dello spazio e sulla considerazione di BVH e quadtree, sono andato con quest'ultimo, poiché ritengo che sia molto più semplice e più adatto al mio caso. Lo implemento abbastanza rapidamente e ha notevolmente migliorato le prestazioni, la ricerca di cibo impiega pochissimo tempo!
Ora il rendering è ciò che mi sta rallentando, ma è un problema per un altro giorno. Grazie a tutti!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
dovrebbe essere più semplice dell'implementazione di una struttura di archiviazione "complicata" SE è abbastanza performante. (Correlato: potrebbe esserci d'aiuto se hai inserito un po 'più di codice nel tuo ciclo interno)