Utiliser plusieurs libs graphiques : ne pas perdre de performances

Utiliser plusieurs libs graphiques : ne pas perdre de performances - Algo - Programmation

Marsh Posté le 24-03-2014 à 08:35:42    

Salut,
 
je voudrais savoir s'il y a moyen de faire une boucle "a la main" en openGL. Je fais actuellement un programme qui permet de se lancer avec plusieurs interfaces graphiques differentes. Je passe donc dans les memes boucles que ce soit pour la SDL ou l'openGL.
Ceci dit, l'openGL a ses propres fonctions qui permettent d'afficher a l'ecran, de fixer les fps etc...
 
J'aimerais bien trouver un systeme permettant de ne pas utiliser a 100% d'un de mes coeurs de proc, que j'utilise la SDL ou l'openGL..
 
Merci pour votre aide :)

Reply

Marsh Posté le 24-03-2014 à 08:35:42   

Reply

Marsh Posté le 24-03-2014 à 10:21:24    

J'ai pas trop compris ta question :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-03-2014 à 15:32:25    

En gros c'est quoi l'opti pour pas utiliser le proc a 100% en faisant un while (1)..?

Reply

Marsh Posté le 24-03-2014 à 15:38:20    

Mettre un sleep entre chaque frames (au moins 1ms si tu bosses avec un delta time).


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 24-03-2014 à 17:17:21    

Mais du coup les évenements ne sont pas super bien catchés si je mets un sleep. La fonction (glut) glutMainLoopEvent() permettrait de ne pas utiliser le proc (sans bloquer cependant la boucle) mais au vue de mon code, cela ne fonctionne pas.
 

Code :
  1. 087 │ void            theGame(ILib *lib, Snake &snake, Event &s_event)
  2. 088 │ {
  3. 089 │   double        now;
  4. 090 │
  5. 091 │   print_all(lib, snake);
  6. 092 │   while (lib->getContinuer() == 1)
  7. 093 │     {
  8. 094 │       lib->gest_event();
  9. 095 │       now = lib->getTicks();
  10. 096 │       if (int(now) % int(s_event.getTime()) == 0)
  11. 097 │         {
  12. 098 │           if (do_event_game(lib, snake, s_event) == false)
  13. 099 │             break;
  14. 100 │           if (print_all(lib, snake) == false)
  15. 101 │             break;
  16. 102 │         }
  17. 103 │     }
  18. 104 │   lib->quitLib();
  19. 105 │ }


 
Ma méthode gest_event() de la lib openGL :
 

Code :
  1. 104 │ void                    my_openGL::gest_event()
  2. 105 │ {
  3. 106 │   glutMainLoopEvent();
  4. 107 │ }


 
Une idée ?

Reply

Marsh Posté le 24-03-2014 à 17:40:51    

glutMainLoopEvent() va traiter toutes les actions de ta fenêtre, quand tu va faire un truc sur ton programme (redimensionner une fenêtre, appuyer sur une touche, etc) toute ces actions sont stockées sur une pile, l'appel de glutMainLoopEvent dépile tout ça et va balancer / traiter les événements.
En quoi un sleep ferait que tes événements soient "pas super bien catchés" ? :??:
 
Là de ce que je vois, cette partie :  
 

Code :
  1. now = lib->getTicks();
  2. if (int(now) % int(s_event.getTime()) == 0)
  3. {
  4.     if (do_event_game(lib, snake, s_event) == false)
  5.         break;
  6.     if (print_all(lib, snake) == false)
  7.         break;
  8. }


 
Va mettre à jour tout ton truc qu'une fois sur s_event.getTime().
Normalement tu le fais tout le temps, en faisant passer le delta time (temps écoulé entre deux frames), tu règles ensuite les vitesses de tes objets en fonction de ce delta-time, une fois la maj faite, tu mets en pause ton programme au moins 1ms (ça permet un p'tit break sur ta CG / ton proco),ou sinon le nombre de milliseconde requise pour lock le framerate à une certaine valeur (genre tu veux 60FPS constant, t'as pris 4ms pour faire la MAJ/rendu, tu fais un sleep(12) ).


---------------
Perhaps you don't deserve to breathe
Reply

Sujets relatifs:

Leave a Replay

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