Comment City-sim peut-il simuler des centaines de personnages?

8

Mes jeux commencent généralement à traîner assez facilement quand il y a quelques centaines de cases représentant des personnages possibles. Alors que des jeux comme SimCity ou même Anno ont des centaines de personnages.

J'ai réalisé que ces jeux ne mettent pas tout à jour à chaque tic, les besoins sont traités par intervalles et ce n'est pas un problème de rendu, mais toutes ces minuscules créatures ont un chemin individuel, etc.
Je ne comprends tout simplement pas comment elles peuvent tirer cela pour des milliers de personnages, même sur de vieilles machines. comment font-ils ça?

Cette question a été mise à jour pour faire référence à des nombres énormes où les individus ne comptent pas vraiment et sont simplement simulés pour l'immersion et l'esthétique.

(Lié si l'on se réfère à des personnages individuels: comment Dwarf Fortress peut-il suivre autant d'entités sans perdre en performances? )

(Question différente mais peut-être liée?: Rendu de centaines de personnages animés dans Unity3D )

MisteriosM
la source
2
Cela ne ressemble pas vraiment à un double pour moi. Bien que des jeux comme Dwarf Fortress simulent les actions de chaque agent individuellement, une fois que nous en sommes aux jeux à l'échelle de la ville comme décrit dans cette question, ce n'est plus très pratique. Au lieu de cela, ces sims opèrent généralement à un niveau plus "fragmenté" des tendances démographiques, ne remplissant les détails des individus suivant ces tendances que lorsque vous regardez de près. En raison de ces différences de stratégies, je pense que cela vaut la peine de rouvrir et de répondre séparément de la question liée.
DMGregory
J'ai fait quelques changements pour mettre en évidence les différences. Comment dissocier les questions?
MisteriosM
L'optimisation des performances est un domaine très large. Il y a un million de choses que vous pourriez faire de mal en termes de performances dans votre jeu. Mais sans regarder votre jeu et la sortie de votre profileur, il est difficile de dire où pourraient être vos goulots d'étranglement. Nous pourrions maintenant tourner dans le noir et réfléchir à la localisation de la mémoire, à la parallélisation ou aux algorithmes avancés de recherche de chemin pour plusieurs agents, mais il est difficile de dire ce que vous savez déjà et ce qui s'applique à votre jeu. J'ai donc peur que cette question soit trop large.
Philipp
Avez-vous déjà essayé le regroupement d'objets? L'instanciation est coûteuse, l'activation et la désactivation d'objets déjà instanciés ne le sont pas (autant)
Vous pouvez également utiliser un émetteur de particules. Puisqu'ils ne sont en réalité qu'une représentation visuelle des données démographiques, ils n'ont pas besoin d'être intelligents ou complexes.
Stephan

Réponses:

12

Comme beaucoup de gamedev, la réponse à la façon dont les jeux de simulation de ville accomplissent cet exploit apparemment impossible est: ils ne le font probablement pas. Ils font juste semblant. ;)

Des sims comme ceux-ci fonctionneront généralement à un niveau "fragmenté", modélisant des groupes de personnes, des quartiers, des couloirs de circulation ou d'autres dynamiques de la ville dans son ensemble, plutôt que de traiter l'IA pour chacun des milliers ou des millions de résidents.

Il y a plusieurs façons dont nous pouvons aborder cela:

  • "Sparse" bottom-up: ici, nous simulons toujours les résidents individuels de la ville, mais pas "trop" d'entre eux, et pas chaque image. Vous pourriez penser à cela comme un sondage ou un recensement délivré à un échantillon aléatoire de personnes chaque semaine. Vous interpolez les résultats pour arriver à des estimations de la population virtuelle plus large - où ils vivent, leur vocation, leur revenu, leur démographie, etc.

    Ainsi, par exemple, si vous ne simulez qu'une centaine d'habitants de votre ville et que 5 d'entre eux sont des étudiants, vous pouvez estimer qu'environ 5% de la population de votre ville sont des étudiants et modéliser la demande d'écoles en conséquence.

    Vous devrez peut-être recréer occasionnellement vos échantillons aléatoires à partir de la répartition de la population de votre ville, pour éviter un regroupement excessif / clairsemé (par exemple, si un quartier devient impopulaire et que tous les habitants du recensement s'éloignent, vous voulez noter l'exode sans le quitter complètement). dépourvu de représentation dans votre sim!)

  • De haut en bas: vous obtenez ici une formule maîtresse qui examine votre ville et modélise sa dynamique dans son ensemble. Dans un style similaire à la macroéconomie, nous négligeons les détails des agents individuels, ou les considérons comme une sorte de "fluide" continuellement divisible de l'activité économique qui s'écoule selon des lois fondées sur des principes.

    Plutôt que de penser aux préférences individuelles et à la variabilité des personnes, vos règles de jeu pourraient ressembler davantage à des équations différentielles reliant les proximités d'agrément et les taux d'imposition et les productivités et les valeurs des propriétés et les taux de criminalité et et et ...

  • Middle-out: divers hybrides entre les deux sont possibles - par exemple, simuler chaque «faction», «industrie» ou segment démographique de la ville comme sa propre méta-personne, prendre ses propres décisions individuelles, mais réparties dans une carte thermique ou la fonction d'onde à travers la ville plutôt que d'exister dans un seul corps. Ou en découpant la ville en quartiers qui traitent chacun leurs propres règles à plus petite échelle en interaction avec leurs voisins.

Maintenant, lorsque le joueur fait un zoom avant assez près pour voir des personnes individuelles, ou regarde des rapports de statistiques citant le nombre d'individus - ce n'est pas nécessairement la vérité fondamentale qui est utilisée pour exécuter la simulation. Ils peuvent plutôt en être un produit présumé.

Disons que nous zoomons sur un bloc de ville particulier. De notre simulation globale de la ville, nous connaissons la population approximative de cette partie de la ville, les types d'activités qui s'y déroulent, les moments de la journée où elle est active. Donc, sur demande, nous pouvons engendrer un nombre approprié de personnes de la démographie appropriée faisant ce genre d'activités là-bas. Leur IA peut être très simple, peut-être aussi peu que jouer une animation sur place ou suivre un point de cheminement jusqu'au bord de la porte / de l'écran le plus proche où ils peuvent réapparaître.

Cela signifie que nous n'aurons généralement pas besoin de rechercher le chemin pour chaque agent. Au lieu de cela, nous pouvons effectuer une passe principale de cartographie des flux sur l'ensemble du réseau routier, afin d'identifier le volume global des différents types de trafic le long de chaque segment. Ensuite, nous pouvons faire apparaître suffisamment de véhicules des bons types dans ces segments pour refléter cette densité. Une fois générés, les agents peuvent simplement se débrouiller avec une direction locale ou des points de cheminement pré-générés pour arriver à un point de réapparition. Garder les placards de réapparition le long de chaque segment correctement équilibrés avec le taux de désapparition nous permet de maintenir le volume constant de trafic que nous voulons.

De cette façon, les personnes et les véhicules que le joueur voit sont des figments, comme un système de particules gonflé donnant l'impression de nuages ​​réalistes sans réellement calculer la dynamique des fluides complète sur chaque molécule de vapeur. ;) Nous les organisons en set dressing pour communiquer l'état de la simulation, plutôt que de la piloter.

Pour de nombreux jeux, cela suffira. Le joueur n'est souvent pas en mesure de sélectionner un agent individuel pour les interroger sur ce qu'ils font là ou où ils vont, il est donc difficile de repérer les coutures et de remarquer si un agent fait quelque chose qui n'a pas de sens, comme conduire trois fois dans le même bloc.

Mais si vous avez besoin d'agents absolument cohérents dans un environnement densément peuplé, vous pouvez envisager une technique soignée appelée " Génération Alibi ". Il s'agit d'une technique d'échantillonnage sophistiquée qui vous permet de générer des agents que vous attendez de trouver dans une situation donnée. Ensuite, si le joueur essaie d'en étudier un plus en détail, vous pouvez rétroactivement échantillonner plus de détails sur ce qu'il fait, d'une manière cohérente avec ce que le joueur a observé à ce sujet jusqu'à présent. L'idée est que vous bénéficiez toujours la plupart du temps des avantages légers des personnes "remplaçantes en carton", mais sur place, elles peuvent constituer un alibi plausible pour passer pour des agents entièrement simulés.

DMGregory
la source