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

Python Discussion :

Vitesse d'éxécution d'une boucle


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par défaut Vitesse d'éxécution d'une boucle
    Bonjour,
    J'aurais aimé savoir si il existe une fonction ou une méthode permettant de faire en sorte qu'une boucle (while) soit ralentie sur des machines assez puissantes mais pas sur des machine à capacité limitée.

    Voilà, en espérant que cela soit possible ...

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Utiliser le module time pour 'noter' le système suivant l’exécution d'une boucle (for i in range(...)) et utiliser cet index pour ralentir les autres ?
    Sans doute.

    Ceci dit un système est susceptible d’être ralenti à un moment donné.

    @+

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par TimDark Voir le message
    Bonjour,
    J'aurais aimé savoir si il existe une fonction ou une méthode permettant de faire en sorte qu'une boucle (while) soit ralentie sur des machines assez puissantes mais pas sur des machine à capacité limitée.

    Voilà, en espérant que cela soit possible ...
    en temporisant, voir le module time.

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Ceci dit 'ralentir' une 'boucle'... C'est sans doute contournable.
    Quel est votre besoin concret ?

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par défaut
    Pour un jeu, j'ai crée un menu principal animé (avec le module PyGame).
    Dans ce menu, il y a des voitures et un ciel défilant.

    Seulement, leur mouvement est fonction de la vitesse de la boucle, qui elle même dépend des capacité de la machine.
    J'aimerais donc que les objets animés n'avance pas trop vite mais qu'il ne soit pas trop ralentie dans le cas où la boucle ne défile pas assez vite.

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par TimDark Voir le message
    Dans ce menu, il y a des voitures et un ciel défilant.

    Seulement, leur mouvement est fonction de la vitesse de la boucle, qui elle même dépend des capacité de la machine.
    J'aimerais donc que les objets animés n'avance pas trop vite mais qu'il ne soit pas trop ralentie dans le cas où la boucle ne défile pas assez vite.
    Regardez ici.

    Mais difficile de répondre sans exemple (et un expert pygame serait plus approprié).
    Dans l'absolue "ralentir" une "boucle" n'est pas trop bon, synchroniser les "objets" de "l'animation" oui.

    @+

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    effectivement, le menu et l'animation devraient être indépendants l'un de l'autre ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    boucle:
        update de l`animation avec temporisation non bloquante
        update du menu

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par défaut
    Merci,
    J'ai utilisé une fonction que j'ai créé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    timer = lambda f: (round((time.time()*f - int(time.time()*f)),1)*10)%2
    f est un facteur multiplicateur.
    Cette fonction retourne 0 si le résultat est pair et 1 si le résultat est impaire.
    Si f=1 la valeur change à chaque dixième de seconde.

    J'utilise cette fonction pour faire clignoter un objet à la seconde (f=0.1) et j'utilise cette même fonction (avec f=100) pour le mouvement de mes objets:
    Mes objet ce situe dans ma boucle while principal, et leur position est incrémenté à chaque tour de boucle, c'est ici que se posait mon problème.
    Effectivement plus la boucle était rapide à l’exécution, plus les objets se déplaçaient rapidement.

    J'incrémente maintenant la position de mes objets avec timer(100), leur position est donc actualisé lorsque timer(100) == 1, soit à chaque fois que que la milliseconde est impaire.

    En tout cas merci pour votre aide.

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    j'ai rien compris ...
    ça m'a l'air bien compliqué.

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par défaut
    La fonction ou ma boucle ?

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    la fonction.

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Je pense que vous faites fausse toute.

    Vous devriez créer un objet Clock (pygame.time.Clock) et utiliser la méthode tick à chaque itération. Cette methode vous permet de stabiliser le framerate de pygame. Exemple : Clock.tick(80) permet de ralentir la boucle pour afficher 80 frame par seconde.

    http://www.pygame.org/docs/ref/time.html#Clock.tick

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par Drawingrom Voir le message
    Je pense que vous faites fausse toute.

    Vous devriez créer un objet Clock (pygame.time.Clock) et utiliser la méthode tick à chaque itération. Cette methode vous permet de stabiliser le framerate de pygame. Exemple : Clock.tick(80) permet de ralentir la boucle pour afficher 80 frame par seconde.

    http://www.pygame.org/docs/ref/time.html#Clock.tick
    cette méthode est bloquante, en général j'évite.

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par défaut
    Effectivement la fonction que j'ai crée pose problème pour l'affichage de mes objet, ils saccadent.

    J'ai donc procédé autrement:
    lors de l'initialisation du menu, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    temps = time.time()
    i = 0
    while i < 1000:
        i+=0.001
    timer = (time.time() - temps)/2
    J'obtiens une valeur (0.03 environ chez moi) qui va me donner la valeur à incrémenter.
    Mon objet ne se déplace plus forcement d'1 pixel en 1 pixel mais de timer pixels en timer pixels.

    Mon problème est donc réglé.

    timer qui dépend donc de la vitesse d'exécution de la boucle de test et donc des capacité de la machine.

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    un truc du genre ?

    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
    from pygame import *
    font.init()
    f = font.Font(None,20)
     
    scr = display.set_mode((300,300))
     
    n = 1
    c = 0
    col = ('red','yellow','green')
     
    clk = time.Clock()
    t1 = t2 = 0
     
    while event.poll().type != QUIT:
     
        laps = clk.tick()
     
        t1 += laps
        if t1 >= 1000:
            #~ truc a faire
            n += 1
            #~ fin truc a faire
            t1 -= 1000
     
        t2 += laps
        if t2 >= 200:
            #~ truc a faire
            scr.fill(Color(col[c%3]))
            scr.blit(f.render(str(n)+' seconde(s)',1,Color('black')),(20,20))
            c += 1
            display.flip()
            #~ fin truc a faire
            t2 -= 200

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Citation Envoyé par josmiley Voir le message
    un truc du genre ?
    OK je vois le genre : l'objectif est de rendre indépendants le calcul et le rafraichissement de l'affichage en utilisant 2 cadences différentes (je me demande d'ailleurs s'il n'y aurait pas une autre façon de faire. Mais est-ce que TimDark a effectivement ce besoin ?

  17. #17
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par défaut
    Mon problème c'est résolu en utilisant la fonction que je présente dans le post #14.

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. connaitre la vitesse d'éxecution d'une boucle while
    Par victor22 dans le forum LabVIEW
    Réponses: 3
    Dernier message: 10/05/2010, 15h15
  3. Vitesse d'un thread ou d'une boucle
    Par Baxter67 dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/01/2008, 12h33
  4. Réponses: 23
    Dernier message: 05/09/2007, 11h53
  5. Réponses: 4
    Dernier message: 04/05/2007, 14h30

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