Gestion du temps [Résolu]

Signaler
Messages postés
69
Date d'inscription
samedi 4 novembre 2000
Statut
Membre
Dernière intervention
15 septembre 2009
-
Messages postés
69
Date d'inscription
samedi 4 novembre 2000
Statut
Membre
Dernière intervention
15 septembre 2009
-
Bonjour,
Apres avoir lu de très intéréssant articles et  tutoriaux comme celui de gros pixel (http://www.grospixels.com/site/animation1.php)
ou encore celui du site du zéro sur la gestion du temps, je reste quand même perplexe...

 D'apres ce que j'ai compris dans ces tutos , Le FPS est le nombre d'image par seconde qu'effectue le programme, mais aussi
 le nombrede boucles par seconde qu'effectue le programme.
 Apres avoir cherché un peu je suis tombé sur la SDL_gfx lib qui me permet de limiter mon FPS, afin que mon programme tourne
 de la même fasson sur n'importe quelle machine  . En plus de cela, avec un SDL_Delay(); bien placé qui permet de réduire la consommation de cpu...

  -Je cherche le meilleur moyen de gerer le temps pour un jeu video, qui serait selon moi (arretez moi si je me trompe)
    * Une boucle d'évenement et d'action se déroulant à fréquence constante (50 ~75hz)
    *Puis un affichage ne dépendant que du hardware de la machine sur laquelle le prog est executé pour atteindre un FPS    maximum.

En Bref : J'aimerai que si la machine ramme, ce soit  Le FPS qui soit pénalisé (le nombre d'image affichée par seconde) ET NON
 La fréquence de la boucle d'évent ;
 Donc un FPS séparé de la fréquence de la boucle !

Voila pour le théorique maintenant je bloque pour la pratique :'(

4 réponses

Messages postés
69
Date d'inscription
samedi 4 novembre 2000
Statut
Membre
Dernière intervention
15 septembre 2009

Bon apres m'être un peu creusé la tête :

LastTick = SDL_GetTicks();
FPS_Calculator.Start();
 while(!done)
   {

 long delta = SDL_GetTicks() - LastTick;
 long rattrape = delta/(1000/75);
     while(rattrape>0)
     {
      HandleInput();
      DoThink();
      LastTick = SDL_GetTicks();
      rattrape--;
     }

     DoRender();

    //SDL_framerateDelay(&FPS_man);
   }

ça m'a lair de marcher XD
dsl la prochaine fois je réfléchirais plus avant de poster
En espérant que ça puisse un jour aider un débutant :)
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Ben si tu veux que gestion des messages et affichage des images ne soient pas synchronisés, t'as pas beaucoup d'autre choix que de les mettre dans deux threads séparés...
Messages postés
69
Date d'inscription
samedi 4 novembre 2000
Statut
Membre
Dernière intervention
15 septembre 2009

J'aimerais si possible éviter le multithread,
J'avais lu un tuto avec allegro et les timers, et il me semblent qu'ils avaient réussi a bloquer les calculs à 60 hz et le fps était déterminé par la machine( BPS_TO_TIMER(60);)
Il avaient fait en sorte que si la machine manque de puissance, priorité absolue a la boucle de calcul 60hz, et ya que le Fps Qui morphle. C'est cela que je recherche
 Je suis tombé SDL_gfx mais bon bloquer Calculs + Déssin à 50hz ne me semble pas satisfaisant , même si ça permet une consommation modérée du temps cpu.
  J'ai trouvé ça aussi
bool done = false
while(!done)
Uint32 temps = SDL_GetTicks();
if(SDL_GetTicks() > (temps + 20) )

{

/* Code... */

}

Affichage();
Mais bon est-ce qu'en cas de retard la boucle de calculs sera prioritaire sur celle d'affichage ? si l'affichage dure trop longtemps,
metttons allez soyons fou 40 ms comment faire pour rattrapper ce retard ? Jai bien une petite idée je vais sérieusement y réffléchir XD
Messages postés
69
Date d'inscription
samedi 4 novembre 2000
Statut
Membre
Dernière intervention
15 septembre 2009

Donc de fasson plus claire voila où j'en suis :

while(!done)
   {

     long ElapsedTicks = SDL_GetTicks() - LastTick;
     int rattrapage = ElapsedTicks/(1000/75);
    while (rattrapage >0 )
    {
     HandleInput();
     DoThink();
     rattrapage--;
    }
     DoRender();
    //SDL_framerateDelay(&FPS_man);
   }

de fasson à ce que si on pren du retard, on repasse par la boucle de calcul autant de fois qu'il faut :
Imaginons qu'il s'est passé pile poil 1000/75 ms depuis la derniere frame; rattrapage vaut   1;
et  puis on execute une fois la boucle évent et on affiche.
Maintenant on a pris 2* 13ms de retard, rattrapage vaut 2;  on execute 2 fois la boucle d'évent...
Ceci devrais "Théoriquement " fonctionner mais bon    .... mon fps diminue progressivement sans s'arretter mais de fasson de plus en plus lente.... :'(    Help !