Il y a deux choses distinctes à considérer lors de la mesure et de l'optimisation des performances d'un système d'entités à si grande échelle.
Au bas niveau, vous avez la représentation physique de vos entités qui se résume à utiliser des dispositions de stockage efficaces comme SoA (structures de tableaux) pour réduire le coût d'itération et de mise à jour de toutes les entités actives.
Au niveau supérieur, vous avez la logique de prise de décision, la logique générale du jeu, l'IA et la recherche de chemin. Ce sont toutes des tâches qui ont en commun de ne pas avoir à s'exécuter au même taux de mise à jour que votre rendu.
Comme vous obtiendrez une durée de trame inégale si vous adoptez l'approche naïve de simplement effectuer ces tâches toutes les N trames, il est généralement avantageux d'amortir le coût sur plusieurs trames.
Si la tâche est de nature incrémentielle, vous pouvez exécuter une partie de l'algorithme à chaque trame et utiliser des résultats partiels dans vos mises à jour.
Si la tâche est en grande partie monolithique mais séparable par entité, vous pouvez effectuer cette tâche pour un sous-ensemble de vos entités de jeu par image, en effectuant une rotation entre elles de manière circulaire. Cela a l'avantage de réduire la complexité de choses comme l'orientation et l'IA, car tout le monde n'essaie pas d'agir en même temps.
Dans le RTS tactique à grande échelle sur lequel j'ai travaillé, nous nous sommes concentrés sur des structures de données robustes pour interroger la représentation de bas niveau dans les algorithmes de haut niveau, pour trouver les voisins des entités de jeu. Le processus de mise à jour de bas niveau a agi selon les intentions fournies par la simulation de haut niveau à mise à jour lente, et s'est finalement soldé par une simulation de particules bon marché, évoluant bien en milliers.