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

ODE Discussion :

stepsize et framerate


Sujet :

ODE

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut stepsize et framerate
    Bonjour,

    Je viens de lire la documentation de ODE (Open Dynamics Engine). Un point en particulier a éveillé mon attention, et j'aimerais des précisions.

    Quand on travaille avec ODE, le programme prend la forme d'une boucle ou on appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void dWorldStep (dWorldID, dReal stepsize);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void dWorldQuickStep (dWorldID, dReal stepsize);
    à chaque itération. Or, la documentation précise que stepsize doit être une constante, c'est à dire ne pas varier d'un appel à l'autre, faute de quoi on risque de faire trembler les objets (jittering). Source : http://opende.sourceforge.net/wiki/i...al_%28World%29.

    Mais il me semble que l'intérêt de ce paramêtre, c'est de pouvoir s'adapter aux différents framerates qu'aura une application sur différentes applications, en donnant comme stepsize le temps passé à rendre une frame. Or ce temps est variable selon le cas (nombre d'objets à l'écran etc), y compris d'une frame à l'autre sur une même machine.

    La solution serait à priori de donner un framerate constant à l'application en le forçant à attendre si une frame est rendue rapidement. Mais celà a plusieurs inconvénients:
    - les propriétaires de machines lentes ne pourront pas utiliser l'application si son framerate a été fixé trop haut, même si elles auraient pu le faire tourner à un framerate inférieur,
    - les propriétaires de machines rapides qui auraient pu faire tourner l'application à un framerate élevé n'en profiterons pas,
    - on est obligé de choisir un framerate pour le pire des cas même si ce cas arrive rarement.

    C'est plutôt embêtant. Ma question est donc de savoir si mon inquiétude est fondée ou est-ce que je m'inquiète pour rien?

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    rhaaa le time stepping de moteur physique discret, un vrai bonheur de prise de tête

    en gros, il te faut fixer un timestep qui correspond à la finesse de simulation que tu souhaite. une fois ce time step trouvé (généralement par de merveilleux tests empiriques), tu peut très bien faire une boucle de ce genre ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    pour chaque frame
        elapsedTime = previousElapsedTime + real elapsedTime
        tant que elapsedTime > timeStep
            faire un pas de simulation
            elapsedTime -= timeStep
        fin tant que
        previousElapsedTime = elapsedTime // on sauvegarde les quelques millisecondes
        // qui n'ont pas été consommée par le moteur physique
    en gros, ca consiste tout simplement a decoupé ta frame en plusieurs pas de simulation physique si jamais le temps ecoulé est trop important... c'est en gros la solution basique pour régler ton problème, et en plus, si l'ordinateur est très rapide, les pas de simulations ne seront pas forcement fait à chaque frame, d'ou gain de calculs...

    oui mais voila, cette solution à un gros problème, c'est que, comme souvent, on ne donne qu'au riches .
    en gros, plus l'ordinateur va être rapide, plus la probabilité de faire un calcul physique sera faible, et inversement, plus l'ordinateur sera lent, plus la probabilité de faire le calcul physique sera élévé. Mais encore, si il n'y avait que ca, ce serait plutot suportable, mais en fait non, il existe un problème encore pire avec cette solution . dans le cas d'un ordinateur lent, la probabilité de faire un ou plusieurs pas de simulation est forte, et donc l'ordinateur va "perdre" du temps a faire des calculs, or ce temps perdu va encore augmenter le nombre de pas d'iteration du moteur physique à la frame suivante, on risque donc d'avoir une prochaine frame encore plus lente que la frame courante et ainsi de suite, jusqu'a ca que le moteur tombe a 0 FPS .
    Une solution pour resoudre ce problème consiste à limiter le nombre de pas d'iteration par frame pour que le temps de calcul physique ne soit jamais superieur au temps d'affichage de la frame, mais du coup, on risque de perdre la synchro entre l'affichage et la physique, et, plus genant, le moteur se comportera differamment sur un ordinateur lent et sur un ordinateur rapide...

    bref, faire un system de time stepping robuste, c'est loin d'être facile
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Ca ne se voit pas mais je suis en train de pleurer là. Si on est trop gourmand, on fait passer le moteur physique plusieurs fois par frame ce qui gâche du CPU et si on ne l'est pas assez, on ne calcule la physique qu'une fois sur deux, ce qui fait que l'on rend deux frames identiques ce qui n'a aucun intérêt... Est-ce que tous les moteurs physiques (open source et gratuit y compris dans le cas d'une application commerciale) sont comme ça? Je vais jeter un oeil du coté de Bullet.
    ( Le wiki de Bullet est en panne!)

  4. #4
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    normalement, avec bullet, le problème est moindre grace aux detection de collision continue (les fameuses CCD), mais je n'ai personnellement jamais approfondit le sujet.
    mais de toute façon, tu a tout interet a passer à bullet qui est bien plus evolué qu'ODE en terme de simulation paralleles, utilisation d'instruction SIMD et autres truc modernes
    (par contre, c'est vrai que le site est en rade depuis 2 jours )
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Je n'arrive pas à trouver de la doc sur Bullet. Connaissez vous une bonne adresse?

  6. #6
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    bah en fait, il n'y a juste pas de documentation pour l'instant sur bullet... tout se fait directement dans les exemples et dans la doc doxygen (pour le peut de commentaire qu'il y a dans les classes)
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Youpi j'ai 0 expérience sur les moteurs physiques donc aucun problème pour improviser! Heureusement je n'en ai pas besoin pour tout de suite.

    Merci pour vos réponses.

  8. #8
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    ne t'inquete pas, les moteur physique, c'est beaucoup plus simple à utiliser qu'à coder .
    avec toutes les demo/exemples qui trainent sur le net, plus la doc d'ODE qui donne pas mal d'info interessante (même pour bullet ), tu peut t'en tirer au moins pour faire un truc de base. Apres, l'experience vient en codant
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/12/2007, 18h28
  2. Probleme avec le framerate
    Par Loack- dans le forum SDL
    Réponses: 6
    Dernier message: 19/03/2007, 10h38
  3. Problème limitation Framerate (2D)
    Par Zacks dans le forum API graphiques
    Réponses: 4
    Dernier message: 07/03/2007, 19h14
  4. Réponses: 2
    Dernier message: 30/11/2006, 22h30
  5. Probleme de framerate
    Par viddak dans le forum DirectX
    Réponses: 2
    Dernier message: 25/08/2002, 09h45

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