Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Thread très lent  (Lu 2557 fois)

0 Membres et 1 Invité sur ce sujet

Logitux

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Thread très lent
« le: Août 19, 2013, 03:25:22 pm »
Bonjour,

je reviens encore vers vous, cette fois-ci pour un problème de thread.
Lorsque je charge la map en "live", celle ci fait 0.12 secondes pour se charger. Par contre ça me fait un mini lag bien évidemment. Donc je me suis penché sur les threads. (C'est du nouveau pour moi.)

Je fais donc quelques tests et j'ai fini par le faire fonctionner. Malheureusement, mon thread fait plus d'une minute à s'exécuter! Je ne l'exécute qu'une fois et une boucle while s'occupe de charger la map quand il le faut.

Je vous met le projet en fichier joint.
Sur game.py à la ligne 37
Il suffit de changer self.loop en True pour activer le chargement avec thread. Avec le False, c'est le draw qui s'en charge.

Après une investigation, j'ai vu que c'était dans le fichier "tileset.py" à la méthode "generate_map()" qu'il perdait tout ce temps.

Cette méthode est appelée (maximum) 9 fois. 1x pour la région où se trouve le centre de la caméra et 8x pour les régions contiguë. (1 région = la résolution de la fenêtre)

Dans cette méthode je remplis un vertexArray temporaire avec la position des tiles/texture
Et que j'assigne ensuite à l'aide d'un mutex (si j'ai bien compris l'utilisation), au vertexArray qui est affiché.
(Les tableaux sont, a priori, vidé donc ça ne devrait pas être une surcharge à ce niveau là ni le fait d'utiliser un tableau temporaire plutôt que d'assigner directement.)

Étant encore étudiant dans la domaine de la prog, je prend toutes les critiques/remarques/suggestions à bon compte.

Encore une fois ce sera un grand merci si quelqu'un aurait une idée de ce qui fait ralentir cette partie. (Peut être le nombre de boucle, mais ça me surprendrait un peu.)

Et désolé de vous importuner avec mes questions  ::)

Edit:
J'ai oublié, j'utilise un clavier qwertz, donc c'est w, a, s, d pour se déplacer.
Également, il faut partir en bas à droite. Dans l'autre sens il n'y aura rien.
« Modifié: Août 19, 2013, 03:26:53 pm par Logitux »

Logitux

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Thread très lent
« Réponse #1 le: Août 22, 2013, 07:03:11 pm »
On m'a orienté vers le multiprocessing.
J'ai fais un petit test et il me ressort un résultat en 0.06secondes au lieu d'1 minute.
Je pense être sur la bonne voie.

Merci quand même :)

Logitux

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Thread très lent
« Réponse #2 le: Août 26, 2013, 04:51:52 pm »
Je déteste devoir me renseigner sur les forums et faire perdre du temps, mais là je bloque... Vraiment.

Je suis toujours sur cette histoire de thread/multiprocessing.
Globalement, mon multiprocessing fonctionne. Mais c'est juste que ça n'a pas l'air compatible avec les vertexArray. C'est plus que certains que je ne sais pas utiliser correctement ces multiprocess.
J'ai essayé avec les queues, les pipes, etc... (sans mauvais jeu de mot  ;D ) mais je fini toujours avec un crash.

En gros, le multiprocessing gère les vertex. C'est juste qu'il n'arrive pas à les retourner correctement.

Un petit exemple que j'ai testé avec avec le pool async


import sfml as sf
from multiprocessing import Pool

def process():
        mp_vertexArray = sf.VertexArray(sf.PrimitiveType.QUADS)
        # imaginons un remplissage de mp_vertexArray
        return mp_vertexArray



if __name__ == '__main__' :

        # juste un test pour s'assurer ce qu'on connait deja
        test_vertexArray = sf.VertexArray(sf.PrimitiveType.QUADS)
        print test_vertexArray, "position, c'est bon!"
        print type(test_vertexArray), "type, c'est bon!"
        print len(test_vertexArray), "taille, c'est bon!"

        print "-------------------------------"

        # multiprocessing
        pool = Pool()
        res = pool.apply_async(process)
        vertexArray = res.get()

        # sortie du mutiprocessing
        print vertexArray, "position, c'est bon!"
        print type(vertexArray), "type, c'est bon"
        print len(vertexArray) # devrait retourner 0! Au lieu de ca, c'est un joli crash! Ouch...
   

La sortie :

Citer
<sfml.graphics.VertexArray object at 0x0051F1D0> position, c'est bon!
<type 'sfml.graphics.VertexArray'> type, c'est bon!
0 taille, c'est bon!
-------------------------------
<sfml.graphics.VertexArray object at 0x0051F330> position, c'est bon!
<type 'sfml.graphics.VertexArray'> type, c'est bon
[Finished in 2.9s with exit code -1073741819]


Est-ce qu'il y a une méthode particulière à utiliser? J'ai pensé au ctypes, mais ça m'a eu l'air assez complexe. Alors avant que je perde encore 1 semaine sur mon projet, je me demandais si c'est réalisable avec ça. Ou sinon avec quoi?
Merci (again)