Repérage et évitement des collisions sur mobile

8

Actuellement, je développe un jeu de type Diablo pour plate-forme mobile (iphone5 +).

Une simple recherche A * trouvera le chemin, mais la prévention des collisions doit encore être prise en considération.

Il y aura environ 50 monstres actifs en même temps, donc les performances sont très importantes.

J'ai trouvé quelques méthodes qui pourraient fonctionner.

  1. NavMesh + RVO

    La bibliothèque de refonte / détour fonctionne bien sur la pathfindingpièce, mais sa simulation de foule atteint rapidement la limite (plus de 5 ms pour 30 agents).

    Une autre bibliothèque RVO2 semble correcte (moins de 2 ms pour 50 agents), mais la bibliothèque a quelques problèmes de licence.

  2. Champs d'écoulement + moteur physique

    De nombreux jeux RTS utilisent cette méthode, mais il semble qu'un moteur physique soit nécessaire pour résoudre les collisions. Si de nombreux agents ne partagent pas un objectif commun, cette méthode peut coûter plus cher que la recherche de chemin A * traditionnelle.

  3. Comportements de direction + moteur physique

    Les comportements de pilotage incluent de nombreux concepts, je pense que cela simple avoidance behaviorpourrait fonctionner (il suffit de tourner à gauche / à droite s'il y a quelque chose en face), mais la méthode nécessite toujours un moteur physique pour fonctionner ensemble.

Je ne sais toujours pas lequel utiliser, il existe peut-être d'autres méthodes de recherche de chemin et d'évitement des collisions.

PS Halo:Spartan Strikeutilise Havok AI (basé sur RVO?), Mais je n'ai pas vu beaucoup d'ennemis dans ce jeu, donc je me demande si la première méthode (NavMesh + RVO) fonctionnera bien sur une plateforme mobile.

lostyzd
la source
Votre GPU a plus de 50 unités de traitement, donc exécuter A-star sur le GPU pour chaque monstre devrait fonctionner juss aussi vite que sur un CPU normal pour ne agent.
Pieter Geerkens
@PieterGeerkens La partie pathfinding fonctionne bien maintenant sur mobile (moins de 0,1 ms par requête), mais pas la partie anti-collision. Nous avons également beaucoup de tâches de rendu, donc je suppose que le GPU n'aura pas de temps libre pour éviter les collisions.
lostyzd

Réponses:

4

C'est une question assez intéressante, et je vais essayer de contribuer avec ce que je peux.

Tout d'abord, je pense que vous devez définir clairement les limites du jeu que vous essayez de créer et définir ces questions (certaines ont peut-être déjà reçu une réponse).

  • À quelle distance est le monstre aggro?
  • Combien de monstres en même temps est votre cible?
  • Comment est organisé votre terrain? Est-il carrelé?
  • Combien d'évitement de collision souhaitez-vous?

Pour citer une réponse d' ici sur la façon dont la recherche de chemin se fait dans Starcraft 2:

Starcraft II utilise une triangulation Delaunay contrainte du terrain de la carte et des bâtiments pour produire un maillage naval; Un * avec un filtre en entonnoir est utilisé pour cheminer le long de ce maillage, en tenant compte des rayons unitaires; puis des couches locales de direction et d'évitement de collision sont ajoutées en plus de cela, y compris une fonction coopérative "repousser les unités inactives" où il est possible de déplacer une unité au lieu de la contourner dans certains cas. De plus, les unités se déplaçant en parallèle sont ignorées pour éviter les collisions, car elles peuvent être garanties de ne pas s’affecter; [...] SC2 utilise six forces de direction: suivi, flocage, regroupement, séparation, évitement et arrivée.

Revenons donc à vos 3 propositions:

  1. NavMesh + RVO -> S'il y a des problèmes de licence, ce n'est pas une option. Ce pourrait être la mise en œuvre la plus simple.
  2. Champs de flux + moteur physique -> Cela dépend honnêtement, mais il semble vraiment intensif en calcul dans un environnement semi dynamique comme vous le souhaitez
  3. Comportements de direction + moteur physique -> Le comportement de direction me semble la voie à suivre. De cette façon, vous pouvez définir de très bons comportements de troupeau pour votre jeu, en fonction par exemple du type de monstre. Et cela s'accorde bien avec le nombre de mob. Cependant, je resterais loin de la physique pour la détection des collisions. Un simple comportement d'évitement suffit, réduisant la vitesse ou augmentant, tournant, etc.

Quelques notes sur les comportements de pilotage, vous pouvez définir autant de forces de pilotage que vous le souhaitez, avec les zones que vous souhaitez. Vous en avez besoin d'au moins 3 pour le flocage / l'attraction / la répulsion, mais d'autres sont probablement intéressants.

Ensuite, essayez de trouver une bibliothèque qui gère les comportements pour voir si elle correspond à vos besoins (comme ça ? Je n'en connais pas vraiment, mais elle existe).

Si la bibliothèque ne correspond pas à vos besoins, alors vous êtes prêt à vous amuser! Mais il y a suffisamment de ressources et d'algorithmes pour implémenter vous-même les comportements de flocage. Exemple 1 Exemple 2

Si vous choisissez de vous implémenter, sachez qu'il y a de belles optimisations à faire, car la portée de votre agent est réduite par exemple par son emplacement dans le troupeau. Il devrait de toute façon être inclus dans certains des algorithmes.

Eh bien, c'est le meilleur de ma connaissance, je ne suis pas sûr de toute façon

Bluk
la source
Merci de répondre. Le comportement de direction fonctionnera-t-il bien dans une scène dense? Les démos de ce didacticiel comportent de nombreuses collisions et oscillations.
lostyzd
1

Si les chemins ennemis ne sont pas très dynamiques (Dynamique serait que chaque couple d'agents attaquent différentes cibles et les chemins vers ces cibles doivent être mis à jour à chaque couple d'images)

Ensuite, je ferais une combinaison de champs de flux et de comportements de pilotage si la performance est votre principale préoccupation. Il y a des sujets plus compliqués impliqués comme le partitionnement de l'espace de vos agents, donc trouver des voisins est plus facile mais c'est votre meilleur pari pour les performances. (suppression de votre recherche A * et utilisation de champs de flux pour diriger vos agents)

Ces deux algorithmes combinés sont généralement considérés comme la solution la plus optimisée pour les scènes denses d'agent avec peu de cheminement dynamique.

J'éviterais la physique quelle que soit votre option finale car elle peut devenir lourde.

Les collisions entre agents peuvent être presque entièrement gérées par des comportements de pilotage et les champs de flux réduisent le poids de 50 agents calculant les trajets. Gardez à l'esprit cependant que les champs de flux deviennent de plus en plus chers plus la taille de votre carte est grande, plus la taille de votre grille est petite et plus votre sélection cible doit être dynamique.

Saevax
la source
J'aime l'idée des champs d'écoulement. Mais pour autant que je sache, Annihilation planétaire et Starcraft utilisent la physique pour éviter les collisions, donc je ne suis pas sûr que le champ d'écoulement puisse être fait sans le système phyics.
lostyzd
Ils peuvent, tout ce que vous avez à faire est de créer un comportement de pilotage de champ d'écoulement. Sa seule fonction est de vérifier l'emplacement actuel de sa grille pour son vecteur de flux. Un champ de flux ne fait que diriger vos agents, les autres comportements de pilotage s'occupent des collisions.
Saevax