Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2431 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1511113
ptitchep
Posté le 05-02-2007 à 20:12:39  profilanswer
 

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
mood
Publicité
Posté le 05-02-2007 à 20:12:39  profilanswer
 

n°1511116
KangOl
Profil : pointeur
Posté le 05-02-2007 à 20:14:10  profilanswer
 

tu fais du cross-compiling ?

n°1511117
ptitchep
Posté le 05-02-2007 à 20:14:36  profilanswer
 

c'est à dire?


---------------
deluser --remove-home ptitchep
n°1511138
ptitchep
Posté le 05-02-2007 à 21:10:46  profilanswer
 

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
n°1523319
ptitchep
Posté le 03-03-2007 à 22:01:12  profilanswer
 

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
n°1523345
ITM
Avatar peint à la main
Posté le 04-03-2007 à 02:37:25  profilanswer
 

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
n°1523346
ptitchep
Posté le 04-03-2007 à 02:40:52  profilanswer
 

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
n°1523347
ITM
Avatar peint à la main
Posté le 04-03-2007 à 02:49:48  profilanswer
 

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
n°1523348
ptitchep
Posté le 04-03-2007 à 02:59:14  profilanswer
 

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
n°1523358
Ace17
Posté le 04-03-2007 à 09:33:08  profilanswer
 


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

mood
Publicité
Posté le 04-03-2007 à 09:33:08  profilanswer
 

n°1523387
ptitchep
Posté le 04-03-2007 à 14:33:41  profilanswer
 

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


---------------
deluser --remove-home ptitchep
n°1523448
ptitchep
Posté le 04-03-2007 à 20:26:16  profilanswer
 

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
n°1523451
ptitchep
Posté le 04-03-2007 à 20:33:12  profilanswer
 

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
n°1524870
ITM
Avatar peint à la main
Posté le 06-03-2007 à 22:13:15  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[Résolu][VBS Débutant Boucle Do-While-Loop Active Directory]problème mmap avec un deamon [résolu]
[Pb]Projet en C : Distributeur de boisson[résolu] Créer un fichier .bat (l'intérieur du fichier)
Erreur sous C# [Autre soucis]redirection après execution servlet
Execution par cron d'un PHP pour créer une page HtmlChanger la taille d'une fenêtre a l'execution
[RESOLU][PHP] Récupération signature md5 d'un répertoire[Résolu] Comment lire un fichier .ini ?
Plus de sujets relatifs à : vitesse d'éxecution sur différents ordinateurs (Résolu)


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR