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

Physique Discussion :

Temps écoulé entre 2 cycles


Sujet :

Physique

  1. #1
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut Temps écoulé entre 2 cycles
    Salut,
    je développe actuellement un moteur physique et j'utilise le temps écoulé entre 2 cycles en ms mais je m'aperçois que parfois le temps écoulé entre 2 cycles est égal à 0. Quelqu'un a-t-il déjà eu ce "problème" et/ou aurait-il une idée sur comment gérer ce truc ? J'imagine que ça peut poser des problèmes sur une machine très performante (si je skip chaque cycle "instantané" mais qu'ils sont très fréquents plus rien ne vas bouger ) ? D'autant plus que j'utilise des formules du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.velocity.addVector(this.acceleration.getScaled(elapsedTime));
    Ce qui fait que si le temps écoulé est égal à 0 je peux me retrouver avec une accélération nulle :/

    Merci d'avance.
    Vive les roues en pierre

  2. #2
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Comment récupère tu tes cycles ?

    Perso :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    QueryPerformanceFrequency( &frequency );
    first_time = ( (float)frequency.QuadPart );
     
    // .. tout plein de code
     
    QueryPerformanceFrequency( &frequency );
    second_time = ( (float)frequency.QuadPart );
     
    timestep = second_time- first_time;
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Je suis sous Java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.lastTime = this.currentTime;
    			this.currentTime = System.currentTimeMillis();
    			this.elapsedTime = this.currentTime - this.lastTime;
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.lastTime = this.currentTime;
    			this.currentTime = System.nanoTime() / 1000000;
    			this.elapsedTime = this.currentTime - this.lastTime;
    Je viens de voir que System.nanoTime() était beaucoup plus précis mais je vois ça dans la doc qui fait un peu flipper (quoique vu que je calcule la différence il ne devrait pas y avoir de problème) :

    Differences in successive calls that span greater than approximately 292 years (263 nanoseconds) will not accurately compute elapsed time due to numerical overflow.
    T'arrives a avoir des float en C++ ?
    Vive les roues en pierre

  4. #4
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Arff ... en Java .... ca fait bien longtemps que j'en n'ai pas fait ...

    Oui oui, ce sont des float en C++
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Bon bin ça semble bon avec System.nanoTime() j'ai plus de durées égales à 0
    Merci pour les réponses
    Vive les roues en pierre

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Si la machine est performante, cela signifie que la résolution (le nombre de millisecondes) est trop grossière: de temps en temps, la différence vaut 0.
    S'il faut cadencer le cycle à 1/2 ms, il va peut être falloir faire une temporisation?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Qu'est-ce que tu entends par temporisation ?
    Vive les roues en pierre

  8. #8
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Qu'est-ce que tu entends par temporisation ?
    Je pense qu'il veux dire faire attendre ton programme le temps qu'il arrive a un time step minimum pour avoir toujours une valeur minimum > 0..
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  9. #9
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Ah oui effectivement faudra que je teste.
    Vive les roues en pierre

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Ah oui effectivement faudra que je teste.
    Il serait sans doute plus simple de changer la résolution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                            this.lastTime = this.currentTime;
    			this.currentTime = System.nanoTime() / 1000000;
    			this.elapsedTime = this.currentTime - this.lastTime;
    ie, supprimer la division par 10^6
    Pour attendre, il faudrait faire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                       this.lastTime = this.currentTime;
    	           this.currentTime = System.nanoTime() ;
                       waitime <-  this.currentTime <  this.lastTime + 1ms
                       si waitime > 0
                           attendre waitime (avec une fonction qui accepte les nano)
                       this.currentTime = System.nanoTime() ;
    	           this.elapsedTime = (this.currentTime - this.lastTime) / 1000000;
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu veux que ton moteur physique produise des simulations déterministes (reproduisibles à l'identique avec les mêmes paramètres) et améliorer de manière globale la stabilité des calculs, tu devrais de toute façon utiliser un timestep fixe.

  12. #12
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Oui je suis justement en train d'y travailler, en discrete ça marchait plutôt pas mal niveau perf mais en continuous j'ai quelques soucis . Merci pour les conseils.
    Vive les roues en pierre

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

Discussions similaires

  1. Calcul Temps écoulé entre 2 dates
    Par gweddy dans le forum iReport
    Réponses: 4
    Dernier message: 18/12/2017, 16h14
  2. Calculer le temps écoulé entre deux dates
    Par ramoucha23 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 25/08/2016, 17h48
  3. Temps écoulé entre 2 dates et 2 horaires
    Par christ-94 dans le forum VBA Access
    Réponses: 8
    Dernier message: 25/01/2009, 17h53
  4. [Débutant] Calculer le temps écoulé entre deux heures
    Par amine_angel80 dans le forum Assembleur
    Réponses: 2
    Dernier message: 28/05/2008, 16h23
  5. Temps écoulé entre 2 dates
    Par casafa dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 23/12/2005, 03h04

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