vitesse d'éxecution sur différents ordinateurs (Résolu)

vitesse d'éxecution sur différents ordinateurs (Résolu) - C++ - Programmation

Marsh Posté le 05-02-2007 à 20:12:39    

Bonjour
 
Je programme un jeu type Total Annihilation (encore moi  :D ) avec OpenGL et la SDL.
J'ai sur mon pc une version linux (je développe sous linux) et une version Windows (pour mes testeurs). Chez moi les deux versions tournent à environ 300 images par secondes c'est à dire 300 itérations de la boucle principale par seconde. Mais sur les PC de mes amis (à peu près équivalents a quelques centaines de Mhz près et pour des cartes graphiques équivalentes elles aussi) il tourne à environ 70 voir 50 (!) images par secondes.
Comment ça se fait?
Est-il possible que mon compilateur (g++) optimise en fonction de mon système ou quelque chose comme ça? Mes testeurs m'ont affirmé que leurs pilotes étaient à jour. Je n'ai pour l'instant pas de testeur linux, je ne sais donc pas si cela provoque le même problème.


Message édité par ptitchep le 05-03-2007 à 01:42:31

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 05-02-2007 à 20:12:39   

Reply

Marsh Posté le 05-02-2007 à 20:14:10    

tu fais du cross-compiling ?

Reply

Marsh Posté le 05-02-2007 à 20:14:36    

c'est à dire?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 05-02-2007 à 21:10:46    

KangOl a écrit :

tu fais du cross-compiling ?


 
Si j'ai bien compris wikipedia en anglais, non je ne fais pas de cross-compiling.
Je copie les fichiers sur une partition FAT32.
Je reboot sous windows et je compile.  
Après j'execute.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 03-03-2007 à 22:01:12    

Bon alors il s'est avéré  que le plafond obtenu correspond au rafraichissement de l'écran. Pourtant mon rafraichissement n'est pas 300Hz!!! Enfin bon ça le fait sur certains ordis, pas sur d'autres...
 
Pour éviter ce souci j'ai séparé complètement l'affichage du reste du jeu. J'appelle la  fonction d'affichage environ 70 fois par secondes (grâce à un "timer" )  et par contre je fais les calculs du moteur de jeu à chaque itération de boucle. Je me retrouve alors avec quelques milliers d'itérations par secondes et ce, sur tous les pc.
 
Par contre, à chaque fois que le calcul est un peu plus lent (création d'une unité,...) le nombre d'itération par seconde chute très rapidement (logique, la moindre micro-seconde représente un pourcentage important puisqu'une itération ne dure pas 1 ms).
Je me retrouve donc avec une vitesse de jeu qui varie constament, je la calcule toutes les 100ms. Comme le calcul de la vitesse me permet ensuite de calculer les déplacements (entre autres) cela provoque des saccades dans le jeu:
     quand le jeu ralentit, les déplacement sont accélérés pour compenser, mais au moment de la réaccélération du jeu, le programme a encore en mémoire l'ancienne vitesse. Donc le temps que je calcule la nouvelle vitesse, les déplacements sont toujours accélérés comme avant. Puis quand la vitesse est calculée ils redeviennent normaux =>saccade visible à l'oeil nu.
     
...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 04-03-2007 à 02:37:25    

Hmmm quand je programmais comme toi des jeux pour la déconne, je faisais l'inverse : calcul de la logique du jeu à intervalle fixe (vitesse identique chez tout le monde) et affichage le reste du temps. En choisissant un taux de rafraîchissement de la logique pas trop grand y'avait aucun problème.
Je viens de me rappeler que je faisais exactement comme tu fais maintenant quand j'ai fait mon premier jeu ;)


Message édité par ITM le 04-03-2007 à 02:37:53
Reply

Marsh Posté le 04-03-2007 à 02:40:52    

Et comment tu faisais pour avoir un temps de calcul fixe? Chez moi il dépend de la taille de la carte (pas bcp) du nombre d'unités (surtout) et des actions qu'elles sont en train de produire. Si 4 joueurs construisent en même temps 4 usines 3 infanteries et parcourent la carte tout en attaquant à un autre endroit, le temps de calcul explose par rapport au début du jeu quand chacun ne possède qu'une unité de construction.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 04-03-2007 à 02:49:48    

Ah mais justement, le temps de calcul n'est pas fixe ! Là toi tu appelles ta fonction d'affichage 70 fois par secondes et tu as un nombre variable de traitements de boucle du jeu par seconde. Mais on est d'accord, le temps d'affichage varie chez toi? Tu as jamais autant d'unités à l'écran etc.
Bein là c'est pareil en inversé :)
Tout ce qui compte c'est que tu ne mettes pas une période de rafraîchissement de la logique inférieure au temps d'exécution max de ta boucle (mais normalement, tu es plus que largement dans les tolérances, vu que tu dois aussi garder du temps pour afficher)

Message cité 2 fois
Message édité par ITM le 04-03-2007 à 02:59:11

---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 04-03-2007 à 02:59:14    

ITM a écrit :

Mais on est d'accord, le temps d'affichage varie chez toi? Tu as jamais autant d'unités à l'écran etc.
Bein là c'est pareil en inversé :)


Oui on est d'accord, mais si je zappe l'affichage c'est pas grave (sans abus), alors que zapper des calculs...
 

ITM a écrit :

 
Tout ce qui compte c'est que tu ne mettes pas une période de rafraîchissement de la logique inférieure au temps d'exécution max de ta boucle (mais normalement, tu es plus que largement dans les tolérances, vu que tu dois aussi garder du temps pour afficher)


Comment je fais pour connaitre le temps d'exécution max de ma boucle? Comme rien n'est limité dans mon jeu (le but est de se faire des grosses bastons avec beaucoup d'unités) je ne peux pas connaitre le temps max de ma boucle. Surtout que vu mon code (y'a des choses à revoir) le temps de calcul augmente plus vite que le nombre d'unité.
Par exemple si je mets 1 microsec pour une unité dans le jeu, je vais mettre plus de 2 microsecondes pour 2 unites dans le jeu. Enfin je pense étant donné que chaque unité fait la même chose sauf qu'en plus les tests de collisions augmentent avec chaque unité rajoutée (enfin pas tout a fait, c'est vrai que si elles sont proches)
Et puis ce temps dépend aussi du pc sur lequel s'execute le prog non?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 04-03-2007 à 09:33:08    


Il existe un tutorial la dessus, qui a  la base parle d'allegro, mais qui contient un paragraphe assez interessant sur le timing dans les jeux.    ;)  
 
http://iteme.free.fr/download.php3 [...] id=allegro

Reply

Marsh Posté le 04-03-2007 à 09:33:08   

Reply

Marsh Posté le 04-03-2007 à 14:33:41    

Effectivement c'est très intéressant. Je vais me pencher la dessus.
Merci


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 04-03-2007 à 20:26:16    

Ca fonctionne plutôt pas mal :D. Seulement jai encore des saccades (d'affichage seulement les calculs sont nickels) et je trouve quelque chose de bizarre:

Code :
  1. int compteurMili=0;
  2. Uint32 MAJTimer(unsigned int i)
  3. {
  4.   compteurMili+=i;
  5.   return i;
  6. }
  7. void Serveur::lancer()
  8. {
  9.     int timer;
  10.     timer=SDL_SetTimer(1,MAJTimer); //toutes les millisecondes
  11. ...
  12.     while (compteurMili>0)
  13.     {
  14.        //calculs
  15.     }
  16.     MAJmili=SDL_GetTicks();
  17.     (*joueurs.begin())->afficher();
  18.     cerr<<"CompteurMili après affichage "<<compteurMili<<"    MAJmili: "<<SDL_GetTicks()-MAJmili<<endl;
  19. ...
  20. }


 
Résultat (1 ligne par boucle):
CompteurMili après affichage 0    MAJmili: 2
CompteurMili après affichage 0    MAJmili: 3
CompteurMili après affichage 10    MAJmili: 3
 
Je ne comprends pas cet écart et il se répete à chaque fois: toujours 2 ou 3 affichages estimés à 0ms par le compteur et à 2 ou 3 ms par SDL_getTicks. Puis un affichage à 10 (ça augmente plus tard dans le jeu) alors que SDL_getTicks indique le même temps...
Je dois croire lequel?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 04-03-2007 à 20:33:12    

The maximum resolution of this timer is 10 ms
 
Ca m'apprendra à lire avant d'utiliser...
 
edit: j'ai trouvé d'ou venaient mes saccades, je calculais la minicarte (de temps en temps) pendant l'affichage. J'ai donc mis ça dans les calculs et tout fonctionne bien. A part que j'aimerais bien réduire ce pu***n de temps de calcul de la minicarte, mais ceci est une autre histoire, il est temps de dormir.
http://forum.hardware.fr/hfr/Progr [...] 2002_1.htm
 
Merci beaucoup!!!


Message édité par ptitchep le 05-03-2007 à 01:18:36

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 06-03-2007 à 22:13:15    

Oops désolé j'avais zappé.
Heh bien content que tout soit résolu en tout cas :jap:
Bon courage pour la suite, et te décourage pas :hello:


---------------
iteme.free.fr | Mon feedback
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed