postit
Réseau CPC BARRE DE VIE BAS GROS POING Crunchez vos adresses URL
|
Calculez la conso électrique de votre PC
|
Hébergez vos photos
Samedi 26 Mai, 2012
Site protégé par le pare-feu Open Office
Le site du jeu vidéo et du PC dont vous êtes le héros
image_couly_14 Canard PC cadre_recherche
par la redac par 08 septembre 2009 - 10h32
illustration

Je postais la dernière fois un article sur un algorithme maison de pathfinding, en y expliquant son fonctionnement et ses limites.

Il m’avait été reproché de vouloir réinventer la roue, ce qui n’était pas faux. Disons juste que je prenais plus cela comme une simple distraction, plutôt que comme un objectif à remplir dans des délais impartis et aux résultats nécessairement optimaux, demandant moult recherches et documentations.

Dans tous les cas, les commentaires étaient très intéressants et ont nourri mon petit esprit avide de nouvelle sensation. C’est pourquoi j’ai décidé de réécrire mon algorithme de pathfinding de manière à le rendre beaucoup plus performant et complet, en y incorporant le Dijkstra, algo classique en matière de pathfinding.

Je n’expliquerai pas aujourd’hui le nouveau fonctionnement de mon algorithme, mais je peux ici en énoncer les grandes lignes :

Le Dijkstra permet une optimisation du choix de la meilleure voix : Il est plus rapide et ingénieux que de bêtement mesurer un par un tous les chemins et de trouver le plus petit.

Mais il restait encore à les trouver les chemins ! Ce qui est primordial, et que le Dijkstra ne permet pas de faire (à ma connaissance).

J’ai donc récupéré l’idée globale de mon ancien pathfinding et je l’ai améliorée en m’aidant des idées mises en évidence dans les commentaires, pour créer une sorte de « wayPointing automatique » :

Là où dans beaucoup de jeu, les WayPoints (ces points de passage disposés par les designers dans les niveaux des jeux pour permettre à l’IA de s’y retrouver - ce qui est assimilable à de « la triche ») sont d’habitude placés placés manuellement, mon algo détecte les endroits clés qui nécessitent le placement d’un WayPoint, de manière à créer les balises dont nous aurons besoin par la suite pour former les chemins, que le Dijkstra analysera enfin.

Pour ce qui est des collisions avec les blocs, l’algo est resté le même et se base sur des résolutions mathématiques d’intersections.

Mais trêve de papotage, voilà une démo très concluante de ce nouvel algo que je viens de passer toute mon après midi et ma soirée à programmer :

Déplacez les drapeaux pour changer les points de départ/arrivée. Si vous voulez vérifier que le way-pointing est bien automatique, vous pouvez même déplacer les blocs. Mais attention à ne pas faire de passages trop étroits, car l’algo gère la largeur et prévoit si le personnage pourra passer ou non.

Quand le chemin est trop dur à trouver, ou qu’il est impossible à trouver, l’algo est programmé pour « abandonner la partie » : quand il atteint un certain seuil de complexité. C’est le « Max Cycles » auquel correspond le bouton dans la démo. Vous pourrez voir que s’il est mis très bas, l’algo ne retrouvera plus que les chemins les plus simples et sera totalement incapable de sortir du labyrinthe.

Il sera possible, simplement en améliorant l’algo de détection des collisions et en changeant légèrement l’auto-way-pointing (et sans toucher au pathfinding proprement dit), de pouvoir incliner les blocs au lieu de les laisser tous droits, ce qui ouvre beaucoup de perspectives !

 

Au niveau des perf’ :

Dans cette démo, quand vous déplacez les drapeaux, le pathfinding est recalculé en temps réel, 50 fois par seconde (avec le vieux langage du Flash, qui n’est qu’un semi-script peu rapide, en plus). Ainsi il se peut que lors des calculs effectués, les FPS diminuent.

Mais il faut bien savoir que dans le jeu final, il y aura beaucoup moins d’appels au pathfinding, qui ne seront que ponctuels, et se feront sur des niveaux beaucoup moins complexes !

Voilà, amusez-vous bien et dites-moi si vous repérez des anomalies.

 


Commentaires (40)
» Aller au forum
carbish il y a 2 ans
carbish
Très intéressant, surtout que j'ai aussi bien envie de me lancer dans le game making pour suivre l'initiative de tout les braves canards qui mettent la main dans le cambouis. Merci pour tes articles.
lire la suite
Krobill il y a 2 ans
Krobill
Plutôt intéressant comme résultat... Ton système de positionnement des waypoints intermédiaires à l'air de pas mal faire son office. Perso, je pense que ce qui t'as valu les remarques sur le réinventage de la roue (dont la mienne) c'est de présenter ton post de façon un peu ambigüe. Sans commencer par un bon gros disclaimer annonçant que tu ne présentais que des expérimentations personnelles sans documentation préalable, c'était un peu risqué. On pouvait avoir l'impression de lire un article avisé sur le sujet et il fallait attendre la fin pour comprendre que non, en fait tu découvrais le sujet en quelque sorte. Par contre j'ai une petite remarque sur ta qualification d'Action Script qui ne serait "qu'un script de haut niveau". ActionScript depuis la sortie de la 2ème virtual machine de Flash associée à l'AS3, n'a rien d'un simple pauvre langage de script tout pourri comme on en connait depuis des lustres. Ca utilise le même concept de compilation just-in-time que le CLR de C# et ça place donc les performances d'exécutions de l'AS3 à mi chemin entre un langage purement interprété et un langage compilé comme le C++. Certes 10 à 20 fois moins rapide que ce dernier mais tout de même ça dépote un petit peu quand c'est utilisé correctement (typage fort systématique par exemple). Si Flash rame, c'est l'énoooorme majorité du temps la faute à la rasterisation (comprendre l'affichage) qui est toujours purement software. Allez camarade, courage et j'espère que ton projet va avancer parce que c'est pas vilain comme idée de base !
lire la suite
LPTheKiller il y a 2 ans
LPTheKiller
KrobillPerso, je pense que ce qui t'as valu les remarques sur le réinventage de la roue (dont la mienne) c'est de présenter ton post de façon un peu ambigüe. Sans commencer par un bon gros disclaimer annonçant que tu ne présentais que des expérimentations personnelles sans documentation préalable, c'était un peu risqué. On pouvait avoir l'impression de lire un article avisé sur le sujet et il fallait attendre la fin pour comprendre que non, en fait tu découvrais le sujet en quelque sorte.
Je l'admets c'était mal présenté, tout est ma faute Emo
KrobillPar contre j'ai une petite remarque sur ta qualification d'Action Script qui ne serait "qu'un script de haut niveau". ActionScript depuis la sortie de la 2ème virtual machine de Flash associée à l'AS3, n'a rien d'un simple pauvre langage de script tout pourri comme on en connait depuis des lustres. Ca utilise le même concept de compilation just-in-time que le CLR de C# et ça place donc les performances d'exécutions de l'AS3 à mi chemin entre un langage purement interprété et un langage compilé comme le C++. Certes 10 à 20 fois moins rapide que ce dernier mais tout de même ça dépote un petit peu quand c'est utilisé correctement (typage fort systématique par exemple). Si Flash rame, c'est l'énoooorme majorité du temps la faute à la rasterisation (comprendre l'affichage) qui est toujours purement software.
Merci pour ta remarque. J'ignore tous les rouages de l'AS3, mais j'en sais sais un peu plus maintenant. En tout cas, pour faire un moteur physique ça passe pas trop :XD: (j'ai testé <- ça ce n'est que l'ancienne version as2 cela dit). Et oui je type toujours fort, mais faudra que je passe à Flash CS4 pour avoir les tableaux typés et limités qu'offre maintenant l'AS3 au lieu des tableaux grand-n'importe quoi actuels.
lire la suite
Krobill il y a 2 ans
Krobill
Des moteurs physiques il en existe plein aussi bien en AS2 qu'en AS3. Au début en 2D, beaucoup ont été déclinés en 3D avec l'émergence de papervision3D, away3D et les autres... Nicolas Cannasse, le génial créateur de Haxe, a également créé une ébauche de moteur physique 2D aux perfs plutôt impressionnantes. Pas forcément besoin de passer à CS4/Flash Player10 et à la classe Vector (équivalent typé des Array) pour avoir de bonnes perfs, la recette ? Plutôt que de faire : MonTableau.maPropriete = blablabla Ou MonTableau.maMethode() Il faut faire : Var monObjet : MonBeauType = monTableau MonObjet.maProriete = blablabla MonObjet.maMethode() Solution n°2 environ 20 à 40 fois plus rapide que la numéro 1... Les puristes hurleront qu'il faut écrire en fait varMonObjet : MonBeauType = MonBeauType ( monTableau ) Ils auront raison mais bizarrement ça marche sans et en plus c'est plus rapide ! Rooooh oui l'AS des fois c'est chelou... Mais c'est comme ça !!!
lire la suite
LPTheKiller il y a 2 ans
LPTheKiller
Ouais ça fait longtemps que je suis le sujet et que je connais les principaux moteurs physique Flash qui existent. Ce que je veux dire c'est que c'est juste... Ultra-limité par rapport à des trucs comme havok, ou aux superbe effets de mécanique des fluides qu'on peut observer dans beaucoup de jeux actuels. Les trucs flash sont de ce point de vue, je dirai pas des dizaines mais des centaines de fois, voire infiniment moins performant. Merci pour l'astuce. C'est déjà comme ça que je fais, dans la plupart des cas. Je vois pas l'intérêt de faire MonBeauType( monTableau ) sachant qu'assigner la valeur de l'élément du tableau à une variable typée revient à la convertir implicitement. Donc simplement par purisme... Pur :huh: Cette conversion étant faite par le player, qui lui est bien compilé, ça évite une instruction de plus à "interpréter" en AS3 : j'imagine que c'est pour ça que c'est plus rapide.
lire la suite
Krobill il y a 2 ans
Krobill
Disons que le cast implicite qui reviendrait à ne pas ajouter MonBeauType () est défendu dans pas mal de langage et donc considéré comme maaaaaaal. En C# par exemple y'a pas moyen et c'est un langage vraiment proche de l'AS3... Parce que malgré tout, 'caster' un élément sorti d'un tableau, c'est une opération pas du tout safe qui peut générer de jolis plantages au runtime. La classe Vector apporte une structure à tout ça qui t'empêche de fauter, parce que le compilo te tape sur les doigts avant. Par contre pour les perfs c'est ultra ultra décevant. C'est bien simple, un Array correctement utilisé donne les même perfs qu'un Vector...
lire la suite
LPTheKiller il y a 2 ans
LPTheKiller
Ok, maintenant je sais que ça sert donc à rien de passer sous CS4 pour ça, tant mieux d'ailleurs.
lire la suite
Storm-wolf il y a 2 ans
Storm-wolf
Calculer 50 fois le pathfinding par secondes, c'est pas un peu beaucoup? Si tu essayais de le faire moins (genre dix fois par seconde), ne serait-ce pas mieux? Parce que bon, calculer 50 fois secondes, ca fait genre 5 fois par dixième de seconde quand même. Je ne sais pas si quelque chose justifie vraiment une telle intensité. Tu as peut-être tes raisons, mais je trouve que c'est beaucoup de calcul (à priori) inutile. M'enfin, si dans ton jeu les appels sont ponctuels, je suppose que ca va. Petite question: En recalculant le pathfinding moins de fois par seconde, n'auras-tu pas la possibilité, en contre partie, de calculer des chemins plus longs?
lire la suite
Mémoriser | oublié ? | Pas de login ? Inscrivez vous
en ce moment...
Barre de vie
news externe
16/04/12 16:40 - News. | DmC. | FEZ. | Lost Planet 3. | Resident Evil 6. | Skullgirls. | Trials Evolution.
Console Magazine #12 - Avec Resident Evil 6, Lost Planet 3, Devil May Cry, FEZ, Trials Evolution, Skullgirls, The Splatters, Hunters 2…
news externe
26/03/12 08:08 - Off-bit. | Amiga. | Amstrad CPC. | arcade. | Atari ST. | Commodore 64. | Jaleco. | PC Engine. | Saint Dragon. | ZX Spectrum.
Off-bit #56 - Saint Dragon – Metal Planet (Area 1)
Bas Gros Poing
news externe
26/05/12 13:10 - Actualités. | Baston. | News. | Virtua Fighter 5: Final Showdown.
Des détails sur la démo de Virtua Fighter 5 Final Showdown
news externe
25/05/12 23:18 - Combos. | Vidéos. | Streets of Fury.
Desk Combo-a-Day: Streets of Fury!
news externe
25/05/12 11:28 - Actualités. | Baston. | Mortal Kombat.
Un reportage pour les 20 ans de Mortal Kombat
news externe
25/05/12 11:20 - Actualités. | Brèves. | Guilty Gear XX #RELOAD.
Guilty Gear X2 #RELOAD a moins de 3 euros ce weekend
news externe
25/05/12 10:55 - Actualités. | Baston. | Dive Kick.
Dive Kick fait ses débuts en compétition
En kiosque