Gestion du temps

Résolu
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009 - 18 oct. 2007 à 09:14
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009 - 19 oct. 2007 à 12:40
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

cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
19 oct. 2007 à 12:40
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 :)
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
18 oct. 2007 à 21:21
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...
0
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
19 oct. 2007 à 09:41
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
0
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
19 oct. 2007 à 10:04
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 !
 
0
Rejoignez-nous