Intro :
Dans un jeu, il peut être utile de calculer le temps entre chaque affichage pour synchroniser la mise à jour de certaines entités.
En effet la vitesse de calcul fait par votre processeur peut rendre la vitesse de ces entités trop rapide.
Par exemple la vitesse de déplacement d’un modèle peut être plus rapide sur la machine d’un PC avec un processeur plus rapide que le vôtre, parce que la boucle de rendu est appelée plus fréquemment que chez vous.
Un mécanisme de calcul du temps passé entre chaque rendu d’affichage permet de pallier ce problème.
Prérequis :
– Savoir lire du C++.
Explications :
Nous allons utiliser la fonction QueryPerformanceCounter qui donne le temps présent en « count ».
#include <windows.h> __int64 A = 0; QueryPerformanceCounter((LARGE_INTEGER*)&A); /* Instructions */ __int64 B = 0; QueryPerformanceCounter((LARGE_INTEGER*)&B);
On fait la soustraction : B – A, et on a le temps passé (en count) entre l’exécution de ces instructions !
D’autre part il nous faut le temps en seconde (et non en count !)
Dond avec la fonction QueryPerformanceFrequency on obtient le count par seconde.
On aura donc le temps escompté en seconde !
__int64 cntsPerSec = 0; QueryPerformanceFrequency((LARGE_INTEGER*)&cntsPerSec);
Le nombre de secondes escompté en un count est calculé par :
// Secondes par count : float secsPerCnt = 1.0f / (float)cntsPerSec; // Temps en secondes : valueInSecs = valueInCounts * secsPerCnt;
Temps passé entre chaque affichage :
On peut calculer le temps passé entre chaque rendu d’affichage. Notons t le temps passé ;
et le temps passé depuis le ième affichage et
le temps passé depuis le précédent affichage.
On calcule ainsi le temps passé entre chaque affichage. On utilise cette valeur de temps afin de synchroniser la mise à jour de nos entités dans la boucle de rendu :
void MaBoucleDeRendu()
{
/* Instructions */
__int64 currTimeStamp = 0;
QueryPerformanceCounter((LARGE_INTEGER*)&currTimeStamp);
float fTimeSinceLastFrame = (currTimeStamp - prevTimeStamp) * cntsPerSec;
UpdateScene(fTimeSinceLastFrame);
DrawScene();
prevTimeStamp = currTimeStamp;
/* Instructions */
}
Voici un exemple de mise à jour d’une entité en utilisant la valeur fTimeSinceLastFrame (toujours changeante) :
Résumé :
Nous avons vu de quelle façon synchroniser la mise à jour de vos entités de façon à ce qu’elles varient dans le temps à la même vitesse sur toutes les machines.

