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

SDL Discussion :

Gestion du temps indépendante de la machine


Sujet :

SDL

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

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut Gestion du temps indépendante de la machine
    Bonjour à tous, je programme actuellement un petit jeu multijoueurs online qui marche assez bien. Néanmoins, selon les machines, je suis obligé d'augmenter ou de descendre la vitesse d'animation... je ne pense pas que cela soit normal.

    Il y a un système de gestion de temps implanté dans le programme, mais j'aimerai savoir, si c'est la bonne technique pour avoir une vitesse d'exécution indépendante de la machine en question :

    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
     
    tempsActuel = SDL_GetTicks();
    		if (tempsActuel - tempsPrecedent > FPS)
    			{ 
     
    				hero->ApplyForces(ecran);
    				viseur->Draw(ecran);
    				hud->Draw(ecran, script->objec[0]);
    				script->Apply(hero);
     
    				SDL_Flip(ecran);
     
    				tempsPrecedent = tempsActuel;
    			}
    		else // Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut
    			{
     
    				SDL_Delay(FPS - (tempsActuel - tempsPrecedent));
    			}
    La boucle incrémente une variable de la valeur tempsAnim qui peut varier de 0.25 à 0.65 selon la vitesse d'exécution. En effet lorsque tempsAnim > 1, alors on passe à la frame suivante lors de l'animation, et on remet tempsAnim = 0.

    Est-ce la bonne technique ? Si non avez vous des idées ?
    Merci d'avance pour vos réponses.

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Et bien ma foi, c'est censer etre la technique de gestion des FPS.
    Je ne comprend pas reellement en fait.

    Apres, il se pourrait (j'ai bien dit il se pourrait) qui su tu veuille mettre un taux de raffraichissement superieur au taux de l'ecran, alors l'os bloquerai ton taux a celui de l'ecran, d'ou une illusion de perte FPS et/ou de FPS different puisque tout les ecran n'ont pas le meme taux.

    En general, 60 FPS c'est le minimum pour les taux de rafraichissement des ecran (60 Hertz) et cela donne une impression de fluidité.
    Apres, peut etre que ta boucle de dessin depasse tes FPS car la machine est trop lente pour tout faire dans le laps de temps impartie, donc baisse de FPS pouvant entrainer des mouvement saccadé et autres.
    Comme toute les machine ne traite pas les donnée a la meme vitesse, certaine machine arriverons a boucler le traitement dans le temps impartie, d'autre non.

    J'espere t'avoir donner des piste.


    Ah oui, on peut se passer de donner en argument la surface ecran.
    En effet, la surface retourner par SDL_SetVideoMode est en fait une sorte de singleton, pour parler plus generalement, c'est une variable global.

    Donc, tu peux recuperer cette surface sans la passer en argument.
    Utilise :

    SDL_GetVideoSurface();

    Bonne continuation

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    J'ai un peu de mal à suivre, mais je conseille la lecture de cet article ( anglais :s ):
    http://dewitters.koonsolo.com/gameloop.html

    J'espère que ça aide
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Très souvent il n'est pas bon de faire les choses ainsi. C'est une bonne solution pour tester mais au final, il vaut mieux gérer les animations via l'horloge du jeu et non pas le taux de rafraichissement.

    Comme ca, une machine rapide aura toute les images de l'animation, une machine lente sautera les images pour au moins être à la même vitesse.

    Ca donne un pseudo code comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void MyPerso::updateAnimation (int now)
    {
         int interv = (this->last - now) / this->speed;
     
         if (interv)
         {
         this->last = now;
         this->frame = (interv + this->frame) % this->number_animations;
         }
    }
    Jc

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

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    Je vous remercie beaucoup à tous pour vos réponses !
    Cependant, j'aimerais que tu m'expliques un peu plus le principe de ta fonction fearyourself, j'avoue que je ne comprend pas tout au code...
    merci d'avance

    Ah au fait merci beaucoup SofEvans, ta technique marche, j'ai un code plus propre et surtout plus simple avec moins d'arguments ! Merci

Discussions similaires

  1. FB/IB gestion du temps
    Par lio33 dans le forum Débuter
    Réponses: 4
    Dernier message: 04/10/2005, 10h55
  2. [MFC] Gestion du temps
    Par Kevgeii dans le forum MFC
    Réponses: 7
    Dernier message: 02/07/2005, 14h21
  3. Aide pour l'analyse d'un problème de gestion de temps
    Par PAINCO dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 03/06/2005, 15h49
  4. [VB.NET] Gestion en temps réel d'une bdd access
    Par qwiskas dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/02/2005, 19h37
  5. fonction de gestion du temps
    Par fati dans le forum C
    Réponses: 5
    Dernier message: 26/12/2002, 16h32

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