Gestion du temps [Résolu]

cs_Darksheep 71 Messages postés samedi 4 novembre 2000Date d'inscription 15 septembre 2009 Dernière intervention - 18 oct. 2007 à 09:14 - Dernière réponse : cs_Darksheep 71 Messages postés samedi 4 novembre 2000Date d'inscription 15 septembre 2009 Dernière intervention
- 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 :'(
Afficher la suite 

Votre réponse

4 réponses

cs_Darksheep 71 Messages postés samedi 4 novembre 2000Date d'inscription 15 septembre 2009 Dernière intervention - 19 oct. 2007 à 12:40
+3
Utile
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 :)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Darksheep
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 18 oct. 2007 à 21:21
0
Utile
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...
Commenter la réponse de cs_juju12
cs_Darksheep 71 Messages postés samedi 4 novembre 2000Date d'inscription 15 septembre 2009 Dernière intervention - 19 oct. 2007 à 09:41
0
Utile
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
Commenter la réponse de cs_Darksheep
cs_Darksheep 71 Messages postés samedi 4 novembre 2000Date d'inscription 15 septembre 2009 Dernière intervention - 19 oct. 2007 à 10:04
0
Utile
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 !
 
Commenter la réponse de cs_Darksheep

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.