begin process at 2010 02 09 20:20:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

dlls

 > DLL ALGORYTHME DE RECHERCHE DE CHEMIN EN A STAR, A*, FASM

DLL ALGORYTHME DE RECHERCHE DE CHEMIN EN A STAR, A*, FASM


 Information sur la source

Note :
Aucune note
Catégorie :dlls Classé sous :ASTAR, chemin, pathfinding, dll, a star Niveau :Initié Date de création :25/02/2009 Date de mise à jour :26/02/2009 12:16:39 Vu / téléchargé :1 662 / 78

Auteur : Devnix

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Je cherchais un algorithme qui me trouvait un chemin entre deux points avec des obstacles réutilisable, c'est à dire en DLL.
Comme c'était impossible à trouver j'ai décidé de le coder moi même :)
Le but était qu'il soit utilisable dans un jeu, j'ai donc opté pour l'assembleur pour avoir une vitesse d'exécution maximale.

Le source se décompose en deux parties, la partie gestion de la fenêtre (main.asm)
et la partie gestion de la dll (astar.asm)
La première partie n'est pas commentée car elle n'est pas importante.
La seconde est commentée car elle constitue le coeur du programme.

Le programme est compilé sous FASM (www.flatassembler.net).

L'algorithme est basé sur l'A* (voir www.siteduzero.com/tutoriel-3-34333-le-pathfinding -avec-a.html) mais j'ai ajouté une modification qui permet de choisir un chemin rapide à calculer ou un chemin plus cours.

La fonction principale du programme est "PathFinding"
elle prend les arguments suivants :

DebutX & DebutY : Coordonées du point de depard
FinX & FinY : Coordonées du point d'arrivée
PointeurTableau : Adresse du tableau ( le tableau ne sera utilisé qu'en lecture)
Largeur & Hauteur: Hauteur et largeur maximales du tableau
FonctionEvenement: Adresse de la fonction qui recevra les évènements
Details : Si > 0 alors on affiche les détails et on fait un sleep entre chaque calcul de case
VarStop : Adresse d'une variable qui sera vérifiée a chaque calcul de case, quand cette variable est à 1, la fonction s'arrête
Compteur : Adresse d'une variable que l'ont remplira du nombre de cases calculées
Constante : C'est le paramètre qui permet d'optimiser le calcul du chemin ou non, il est utilisé de la manière suivante :
Total = Poids + Distance * Constante  
Où Poids est le poids parcouru, distance est la distance aproximative pour arriver jusqu'à l'arrivée, ce parametre permet donc de modifiier l'importance de la distance par rapport au poids.
Par exemple, avec la constante mise à 0 le chemin recherché sera celui qui aura le poids le plus faible donc le chemin le plus cours.

Le programme est optimisé pour la vitesse d'exécution, il prend donc un certain nombre de place en mémoire qui peux aller jusqu'à plusieurs Mo.

Les coordonnées étant enregistrés sur des words, la valeur maximale du repère est de 65535.


 Conclusion

Si vous avez un conseil d'optimisation ou autre faites moi signe ;)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   INCLUDE
    •   API
      • ADVAPI32.INCTélécharger ce fichier [Réservé aux membres club]25 256 octets
      • ASTAR.incTélécharger ce fichier [Réservé aux membres club]101 octets
      • COMCTL32.INCTélécharger ce fichier [Réservé aux membres club]3 776 octets
      • COMDLG32.INCTélécharger ce fichier [Réservé aux membres club]1 169 octets
      • GDI32.INCTélécharger ce fichier [Réservé aux membres club]16 694 octets
      • KERNEL32.INCTélécharger ce fichier [Réservé aux membres club]37 658 octets
      • MSVCRT.INCTélécharger ce fichier [Réservé aux membres club]145 octets
      • SHELL32.INCTélécharger ce fichier [Réservé aux membres club]5 881 octets
      • USER32.INCTélécharger ce fichier [Réservé aux membres club]29 702 octets
      • WSOCK32.INCTélécharger ce fichier [Réservé aux membres club]3 073 octets
    •   ENCODING
      • UTF8.INCTélécharger ce fichier [Réservé aux membres club]2 258 octets
      • WIN1250.INCTélécharger ce fichier [Réservé aux membres club]1 345 octets
      • WIN1251.INCTélécharger ce fichier [Réservé aux membres club]948 octets
      • WIN1252.INCTélécharger ce fichier [Réservé aux membres club]650 octets
      • WIN1253.INCTélécharger ce fichier [Réservé aux membres club]906 octets
      • WIN1254.INCTélécharger ce fichier [Réservé aux membres club]1 047 octets
      • WIN1255.INCTélécharger ce fichier [Réservé aux membres club]1 294 octets
      • WIN1256.INCTélécharger ce fichier [Réservé aux membres club]1 364 octets
      • WIN1257.INCTélécharger ce fichier [Réservé aux membres club]1 324 octets
      • WIN1258.INCTélécharger ce fichier [Réservé aux membres club]1 334 octets
      • WIN874.INCTélécharger ce fichier [Réservé aux membres club]662 octets
    •   EQUATES
      • COMCTL32.INCTélécharger ce fichier [Réservé aux membres club]44 470 octets
      • COMCTL64.INCTélécharger ce fichier [Réservé aux membres club]44 627 octets
      • COMDLG32.INCTélécharger ce fichier [Réservé aux membres club]9 755 octets
      • COMDLG64.INCTélécharger ce fichier [Réservé aux membres club]8 571 octets
      • GDI32.INCTélécharger ce fichier [Réservé aux membres club]9 452 octets
      • KERNEL32.INCTélécharger ce fichier [Réservé aux membres club]21 660 octets
      • KERNEL64.INCTélécharger ce fichier [Réservé aux membres club]21 680 octets
      • SHELL32.INCTélécharger ce fichier [Réservé aux membres club]844 octets
      • SHELL64.INCTélécharger ce fichier [Réservé aux membres club]910 octets
      • USER32.INCTélécharger ce fichier [Réservé aux membres club]40 612 octets
      • USER64.INCTélécharger ce fichier [Réservé aux membres club]40 688 octets
      • WSOCK32.INCTélécharger ce fichier [Réservé aux membres club]2 247 octets
    •   MACRO
      • COM32.INCTélécharger ce fichier [Réservé aux membres club]995 octets
      • COM64.INCTélécharger ce fichier [Réservé aux membres club]971 octets
      • EXPORT.INCTélécharger ce fichier [Réservé aux membres club]1 370 octets
      • IF.INCTélécharger ce fichier [Réservé aux membres club]8 613 octets
      • IMPORT32.INCTélécharger ce fichier [Réservé aux membres club]1 264 octets
      • IMPORT64.INCTélécharger ce fichier [Réservé aux membres club]1 273 octets
      • MASM.INCTélécharger ce fichier [Réservé aux membres club]1 748 octets
      • PROC32.INCTélécharger ce fichier [Réservé aux membres club]7 838 octets
      • PROC64.INCTélécharger ce fichier [Réservé aux membres club]10 459 octets
      • RESOURCE.INCTélécharger ce fichier [Réservé aux membres club]7 453 octets
      • STRUCT.INCTélécharger ce fichier [Réservé aux membres club]7 909 octets
    •   PCOUNT
      • ADVAPI32.INCTélécharger ce fichier [Réservé aux membres club]9 128 octets
      • COMCTL32.INCTélécharger ce fichier [Réservé aux membres club]1 774 octets
      • COMDLG32.INCTélécharger ce fichier [Réservé aux membres club]350 octets
      • GDI32.INCTélécharger ce fichier [Réservé aux membres club]6 944 octets
      • KERNEL32.INCTélécharger ce fichier [Réservé aux membres club]13 317 octets
      • SHELL32.INCTélécharger ce fichier [Réservé aux membres club]1 581 octets
      • USER32.INCTélécharger ce fichier [Réservé aux membres club]10 552 octets
      • WSOCK32.INCTélécharger ce fichier [Réservé aux membres club]1 358 octets
    • WIN32A.INCTélécharger ce fichier [Réservé aux membres club]609 octets
    • WIN32AX.INCTélécharger ce fichier [Réservé aux membres club]4 123 octets
    • WIN32AXP.INCTélécharger ce fichier [Réservé aux membres club]5 007 octets
    • WIN32W.INCTélécharger ce fichier [Réservé aux membres club]612 octets
    • WIN32WX.INCTélécharger ce fichier [Réservé aux membres club]3 980 octets
    • WIN32WXP.INCTélécharger ce fichier [Réservé aux membres club]5 010 octets
    • WIN64A.INCTélécharger ce fichier [Réservé aux membres club]580 octets
    • WIN64W.INCTélécharger ce fichier [Réservé aux membres club]579 octets
  • astar.asmTélécharger ce fichier [Réservé aux membres club]Voir ce fichier19 578 octets
  • astar.dllTélécharger ce fichier [Réservé aux membres club]5 632 octets
  • astar.dll_Télécharger ce fichier [Réservé aux membres club]5 632 octets
  • compile.batTélécharger ce fichier [Réservé aux membres club]Voir ce fichier64 octets
  • compiledll.batTélécharger ce fichier [Réservé aux membres club]Voir ce fichier65 octets
  • dlg.resTélécharger ce fichier [Réservé aux membres club]876 octets
  • Main.asmTélécharger ce fichier [Réservé aux membres club]Voir ce fichier9 043 octets
  • Main.exe_Télécharger ce fichier [Réservé aux membres club]45 056 octets
  • Main.idbTélécharger ce fichier [Réservé aux membres club]229 531 octets
  • utile.asmTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 624 octets

Télécharger le zip


 Historique

25 février 2009 19:56:00 :
Correction d'un bug
26 février 2009 12:16:40 :
Ajout du poids du chemin.

 Sources de la même categorie

Source avec Zip DLL EFFECTUANT UNE TRANSFORMÉE DE FOURIER RAPIDE par Nasman
Source avec Zip DLL MASM32 ET DARKBASIC PRO par Apinew
Source avec Zip DLL AVEC NASM ET ALINK par ibroman
Source avec Zip OBTENIR LE CPUID DE SON PROCESSEUR (DLL) par sibi12
Source avec Zip DLL-FONCTIONS 3D par quoi

 Sources en rapport avec celle ci

Source avec Zip MANIPULER LES CHEMINS,WINDOWS,DOS,SYSTÈMES.. par ToutEnMasm
Source avec Zip CRÉATION DE DIFFÉRENTS EXÉCUTABLES AVEC NASM ET ALINK par Nasman
Source avec Zip Source avec une capture PROGRAMME DE VISUALISATION ET D'ANALYSE SPECTRALE DE FICHIER... par Nasman
Source avec Zip DLL EFFECTUANT UNE TRANSFORMÉE DE FOURIER RAPIDE par Nasman
Source avec Zip DLL MASM32 ET DARKBASIC PRO par Apinew

Commentaires et avis

Commentaire de BruNews le 27/02/2009 20:23:05 administrateur CS

des appels RtlMoveMemory dans du code ASM, ouh la....
Tu nous parlais vitesse, bein c'est pas avec des appels sur dll externe que tu y gagneras, surtout pour un truc si simple à coder en local. Un compilo C correct remplace l'appel par le code inline, il va te battre à tout coup.

idem des ralentissements en entrée et sortie de quasi chaque fonction.
EAX, ACX et EDX sont à considérer comme écrasés après un appel de fonction, inutile de les PUSHer POPer.

L'ASM ne donne aucune garantie de perfs, on sait seulement qu'on "peut" en obtenir avec de très gros efforts d'optimisation suite à une longue pratique.

Commentaire de Devnix le 06/03/2009 23:58:55

Si tu debug RtlMoveMemory tu vois très vite qu'elle est basée sur une instruction "rep movs" qui est difficilement plus optimisable.
Pour les push/pop de ecx et edx, je vais corriger ça.

Commentaire de BruNews le 07/03/2009 20:33:41 administrateur CS

"rep movs" sont des instructions du temps jadis qu'il convient de remplacer par une boucle perso correctement écrite. Du code perso ne forcera pas obligatoirement les PUSH POP de ESI et EDI, on emploiera les registres libres à ce moment. Depuis le Pentium (c'est pas hier...), une boucle avec des instructions bien parallélisées battra un "rep movs" à tout coup.

Ce qui anéantit gravement les perfs au moins autant, c'est l'APPEL (et donc le FAR JMP suivi du retour) vers la dll externe (kernel32 ici).

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Probleme de dll! (arguments...) [ par BlackWizzard ] salut les pro!voila, G une fonction contenu dans une dll mais cette fonction, je ne sait pas comment lui ajouter des arguments...voici un extrait du c [URGENT] Passer des arguments a une DLL [ par BlackWizzard ] Bonjours, je voudrai creer un dll en asm (ce qui est fait) mais je n'arrive pas a passer des arguments a la seul fonction de cette dll.imaginons le co trouver le chemin du bureau ou menu demarrer [ par Cendra ] voila apres la creation de raccourcis , je cherche a les placer sur le bureau , mais j'ai pas trouver comment localiser le dossier... Fonction DLL avec arguments [ par Arnotic ] Bonjour, J'ai une DLL avec une fonction qui prend 2 arguments (en C (char*, int). Lorsque je la charge j'ai aucun problème mais lors de l'appel à Création de DLL [ par HollowSpecter128 ] Salut à tous!Je voudrais savoir si qq1 pourrais montrer comment on fè pour créer 1 DLL entièrement en assembleur sous NASM ou FASM.Quoique pour FASM j DLL sous masm32v8 [ par Stormy ] Serait-il possible de coder une DLL sous masm dans le but d'établir quelques fonctions très régulièrement utilisées. Le but étant de faire appel par l Registres windows [ par S2R ] Bonjour à tous, Est il possible de créer une clé dans la base de registre sans importer de dll?sinon comment fait-on pour importer une dll avec tasm?m DLL avec TASM ??? [ par Maxilie ] Voila, je voudrais créer une DLL avec tasm pour m'en servir sous un prog en VBProblème :-comment compiler une dll avec TASM-la syntaxe du code est-ell Point d'entrée dans une Dll [ par thiosyiasar ] SalutJ'ai une Dll entre les main et j'utilise Dependency pour trouver les points d'entré.J'ai trois méthodes avec leur adresse d'entrée :- ConvertMetr segment partagé en masm32 [ par anthraxx ] bonjour a tous,je connais l'assembleur mais je suis pas tres habitué a masm32, et je me demandais ce qu'il faut mettre pour qu'un segment donné de ma


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,154 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales