IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Jeu de la vie : rapidité


Sujet :

Caml

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut [Résolu] Jeu de la vie : rapidité
    Bonjour
    J'aimerais faire le jeu de la vie en OCaml.
    Pour ça j'ai fait le bête programme suivant, le plus simple qui me soit venu à l'esprit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #load "graphics.cma";;
    Graphics.open_graph "";;
    Graphics.auto_synchronize false;;
     
    let vie col = (col = Graphics.black) || (col = Graphics.red);; (* Renvoie true si la cellule était vivante à ce tour *)
    let mort col = (col = Graphics.white) || (col = Graphics.green);; (* Renvoie true si la cellule était morte à ce tour *)
     
    Graphics.set_color Graphics.black;;
    Graphics.plot 3 15;;
    Graphics.plot 4 14;;
    Graphics.plot 4 13;;             (* dessine un vaisseau *)
    Graphics.plot 3 13;;
    Graphics.plot 2 13;;
    for k = 2 to 100 do
      for i = 2 to 40 do
        for j = 2 to 40 do
          let nb = ref 0 in
          if vie (Graphics.point_color (i-1) j) then incr nb;
          if vie (Graphics.point_color (i+1) j) then incr nb;
          if vie (Graphics.point_color (i-1) (j-1)) then incr nb;
          if vie (Graphics.point_color (i-1) (j+1)) then incr nb;
          if vie (Graphics.point_color (i+1) (j-1)) then incr nb;
          if vie (Graphics.point_color (i+1) (j+1)) then incr nb;
          if vie (Graphics.point_color i (j+1)) then incr nb;
          if vie (Graphics.point_color i (j-1)) then incr nb;
     
          if Graphics.point_color i j = Graphics.black then
    	if !nb < 2 || !nb > 3 then (Graphics.set_color Graphics.red; Graphics.plot i j) else ()
          else
    	if !nb = 3 then (Graphics.set_color Graphics.green; Graphics.plot i j) else ();
        done;
      done;
      for i = 2 to 40 do
        for j = 2 to 40 do
          if Graphics.point_color i j = Graphics.red then (Graphics.set_color Graphics.white; Graphics.plot i j);
          if Graphics.point_color i j = Graphics.green then (Graphics.set_color Graphics.black; Graphics.plot i j);
        done;
      done;
      Graphics.synchronize();
    done;;
     
    Graphics.close_graph();;
    Mais le problème que je rencontre est celui de la rapidité.
    En effet, là je travaille sur un carré de 40 pixels de côté, et il met déjà quasiment une seconde pour calculer une génération de plus, ce qui est un peu embêtant.
    Auriez-vous quelque chose à me proposer pour en améliorer la rapidité? C'est sans doute possible de le faire aller bien plus vite.
    Est-ce que travailler sur des tableaux plutôt que directement avec des Graphics.plot permettrait d'augmenter la vitesse?

    EDIT : Et d'autre part, y a-t-il moyen de se débarrasser de ces "Graphics." qui traînent dans toutes les fonctions? J'ai essayé #use à toutes les sauces, mais impossible d'obtenir quelque chose.

    Merci d'avance

    Fractal

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    es-tu en mode compilé ou interactif ? si compilé, bytecode ou binaire ?


    Citation Envoyé par Fractal LLG Voir le message
    EDIT : Et d'autre part, y a-t-il moyen de se débarrasser de ces "Graphics." qui traînent dans toutes les fonctions? J'ai essayé #use à toutes les sauces, mais impossible d'obtenir quelque chose.
    open Graphics ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut
    Je suis en mode interactif.

    open Graphics ?
    Ahh, oui, j'avais oublié, je croyais que c'était #use qu'il fallait utiliser

    Fractal

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    À première vue, il y a une réponse simple à ton problème : découple ton problème (l'évolution d'un automate cellulaire) de sa représentation graphique.

    Actuellement tu utilises un même élément (un tableau de couleurs) pour représenter les deux à la fois. C'est très mal. En effet, ton choix n'est pas du tout adapté pour les manipulations "métiers" (la gestion effective de l'automate) : pour savoir si une case est vivante, tu veux savoir si elle est vivante, et pas la couleur du pixel correspondant.

    Fait une matrice de booléens (ou d'entiers si tu veux avoir plus de deux états, mais à première vue des booléens suffisent), manipule la comme une matrice de booléens (sans fonctions Graphics. toutes laides), et code indépendamment une fonction qui prend ta matrice et affiche à l'écran la représentation graphique correspondante.

    Ainsi, tu auras découplé le problème et sa représentation graphique. Tu gagneras en simplicité du code, mais aussi en flexibilité (et si tu veux pouvoir changer de représentation ? de l'ASCII art en console, ou du postscript généré, ou un .gif ?), et probablement en performances (mais dans l'immédiat, avoir un code "simple et clair" est la priorité, les performances viendront ensuite).


    PS : je ne voulais pas émettre un avis sur le sujet, mais maintenant que je suis dans la discussion je me permet de faire une remarque hors sujet (et caustique) : ton pseudo pue.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut
    Oki, je vais faire ça pour voir si ça améliore la rapidité.
    Je sais que les fonctions d'affichage prennent énormément de temps mais je pensais que travailler en double buffering serait aussi efficace qu'avec un tableau d'entiers.
    Je regarde ce que ça donne

    Merci

    Fractal

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Fractal LLG Voir le message
    Oki, je vais faire ça pour voir si ça améliore la rapidité.
    Si jamais tu n'avais pas compris la remarque sous-entendue de Gorgonite : la compilation améliorera tes performances.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut
    Si jamais tu n'avais pas compris la remarque sous-entendue de Gorgonite : la compilation améliorera tes performances.
    Voui mais je sais pas comment il faut configurer Emacs pour qu'il compile et exécute au lieu de lancer l'interpréteur

    Fractal

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Tu peux le faire en ligne de commande à côté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ocamlc graphics.cma tonfichier.ml -o test_bytecode
    ocamlopt graphics.cmxa tonfichier.ml -o test_natif

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut
    En effet, ça va nettement plus vite quand c'est compilé
    (le fait de séparer le calcul de l'affichage avait déjà bien fait augmenter la rapidité)
    Bon, maintenant vu que je suis flemmard, je vais essayer de configurer Emacs pour qu'il le fasse tout seul ^^

    Merci à tous

    Fractal

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème jeu de la vie de Wolfram
    Par romromp dans le forum Pascal
    Réponses: 14
    Dernier message: 11/03/2007, 20h58
  2. algorithme d'évolution du "jeu de la vie" en caml
    Par nono88 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 13/12/2006, 01h56
  3. Conway's life (jeu de la vie) pour images
    Par O( N ) dans le forum C
    Réponses: 1
    Dernier message: 26/09/2006, 03h13
  4. [Conception] Jeu de la vie
    Par deuscapser dans le forum Général Java
    Réponses: 16
    Dernier message: 09/03/2006, 13h47
  5. [VB] projet à réaliser: Jeu de la vie
    Par mauriiice dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/12/2005, 21h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo