[HELP] pb de controle de la rapidité d'un(e) thread.

pb de controle de la rapidité d'un(e) thread. [HELP] - Programmation

Marsh Posté le 29-05-2001 à 00:50:25    

Bon, en fait j'ai déjà posé ce problème sur le forum et j'ai déjà eu qques reponses interessantes mais, apres avoir tout essayé j'en suis au même point. Voila le bin's :
j'ai un jeu avec des balles (pong). D'un coté , y a un (une ?) thread qui gere l'affichage. De l'autre, j'ai un thread qui gere la mise a jour des objets.
Il faudrait que je puisse controler le temps de mise a jour des objets pour une boucle du thread. Disons il faudrait que :
Temps mise a jour + pause fixe(0 ou plus) = 20 ms.
Le pb, c'est que je ne sais pas combien de temps prend la mise à jour car ca dépend des pc (évidant, surtout vu qu'il y a quelques calculs sur des flottants).
 
Qqu'un a une idee ? je suis ouvert à toute suggestion.  
Pour ceux qui se demandent "Pkoi vouloir controller le temps d'éxécution ?", c'est pour que le jeu ait toujours la même vitesse sur des pcs hétérogènes. Quand je regarde Halflife qui tourne sur un 800Mhz et sur un 450Mhz, je me pose des questions : le jeu tourne à la même vitesse. (je ne parle pas de l'affichage, mais des objets qui bougent).

Reply

Marsh Posté le 29-05-2001 à 00:50:25   

Reply

Marsh Posté le 29-05-2001 à 01:05:46    

tu n'as pas besoin d'utiliser des threads pour ça. déplaces tes objets en fonction du temps écoulé depuis le dernier affichage, et ça ira à la même vitesse sur tous les pcs. tu peux faire un timer, ou plus connement utiliser la fonction jesaispluscommentellesappelle() (getsystemtime?) qui renvoie le nombre de millisecondes écoulées depuis le chargement de windows.
 

Code :
  1. int lastTime, curTime, deltaTime;
  2. void moveobjects()
  3. {
  4.   curTime = GetSystemTime();
  5.   deltaTime = curTime - lastTime; // nb de millisecondes depuis le dernier appel
  6.  
  7.   for (i=0; i<numObjects; i++)
  8.     numObjects[i].pos += numObjects[i].speed * deltaTime / speedRate;
  9.   lastTime = curTime;
  10. }


 
avec speedRate = la distance parcourue en une ms.
 
si tu as un pc qui bourre et qui appelle 200 fois la fonction en 200 millisecondes, deltaTime vaudra (en moyenne) 1, donc la distance parcourue sera d1 = 200 * (speed*1/speedRate) = 200*speed/speedRate
 
sur un pc plus lent qui appelle 10 fois la fonction en 200 ms, deltaTime = 200/10 = 20, distance parcourue d2 = 20 * (speed*10/speedRate) = 200*speed/speedRate
 
et d1=d2.  
 
en pratique il vaut mieux utiliser un timer (même un timer multimédia, mais je ne me rappelle plus la différence), en tout cas essaye déjà avec ça.

Reply

Marsh Posté le 29-05-2001 à 01:07:49    

la fonction c'est GetTickCount().

Reply

Marsh Posté le 29-05-2001 à 01:12:51    

Ton idee n'est pas conne du tout. Mais pour ce qui est du timer, j'ai deja essayé (on me l'avais deja dit), mais le problème c'est qu'il y a trop de message WM_TIMER et ils sont ignorés par Windows, vu qu'ils ont une priorité basse.
 
Mais le coup de compter le temps ecoulé, on peut pas le combiner avec des threads. j'insiste car je ne vois pas comment tu fais sans.

Reply

Marsh Posté le 29-05-2001 à 01:21:09    

c'est pas qu'elle est pas conne du tout, c'est que tout le monde fait comme ça :D, que le calcul du temps écoulé vienne de GetTickCount(), WM_TIMER, ou je ne sais quoi encore.
 
les rares fois ou j'ai utilisé un timer je n'ai pas eu de problèmes, bizarre ... en tout cas tu peux utiliser sans problème GetTickCount() dans ton thread car c'est une fonction globale (ie ce n'est pas un message win32). la résolution du timer est quelque peu grossière, mais ça doit suffire pour un pong.
 
si tu as besoin d'un timer haute résolution, mates la doc sur les timers multimedia. mais ton pong devrait déjà bien marcher avec GetTickCount(), essaye voir.

Reply

Marsh Posté le 29-05-2001 à 01:22:40    

youdontcare a écrit a écrit :

Code :
  1. for (i=0; i<numObjects; i++)
  2.     numObjects[i].pos += numObjects[i].speed * deltaTime /




bon c'est plutôt objets[i].xxx += objects[i].yyy + .... le lecteur aura rectifié de lui-même :)

Reply

Marsh Posté le 29-05-2001 à 01:34:33    

je vais tester. Merci, ca fait trop longtemps que je cherchais, et personne n'était capable de me filer une réponse claire et concète. C'est cool.

Reply

Sujets relatifs:

Leave a Replay

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