Quel est le moyen le plus efficace de maintenir un taux de cadre stable avec DirectX et C ++?

StackOverflow https://stackoverflow.com/questions/1583436

Question

J'apprends DirectX d'un livre sur la programmation du jeu, et il utilise la méthode suivante pour une boucle de jeu:

long int start = GetTickCount();
while(true)
    GameRun();

void GameRun()
{
     if(GetTickCount() - start >= 30)
         //do stuff
}

Cela rend start égal quel que soit le temps est (je devine obtenir le nombre de tiques donne le nombre de « tiques » depuis le début du programme), puis, 30 tiques plus tard, fait tout de l'AI, le rendu, etc.

Ma question est, ne serait-il plus efficace de faire tous les AI, etc., puis, s'il y a du temps restant, attendez que le cadre doit être changé?

Alors, quelle serait une meilleure façon de maintenir un taux de cadre stable? (De préférence en utilisant uniquement les en-têtes DirectX que je serais déjà utiliserai pour son, des images et des imput (comme d3d9.h))

Et, sur une note connexe, ce qui fait exactement GetTickCount () faire, et combien de temps est un 'tick'

Était-ce utile?

La solution

Pour votre boucle de jeu, lisez cet article . Il somme vos options et rend votre choix clair.

pour GetTickCount (), il est le moyen le plus simple pour obtenir le temps dans Windows (je ne sais pas l'un pour les systèmes d'exploitation unix). QueryPerformanceFrequency et QueryPerformanceCounter donne beaucoup plus de précision, mais peut-être difficile à comprendre comment les utiliser à droite.

Vous pourriez être intéressé par la façon dont le :: class Ogre minuterie fonctionne ( est un véritable ogre open source bien connue -temps rendu 3D bibliothèque). Ils ont ajouté un code pour faire face à des problèmes potentiels avec ces fonctions et il y a un code pour plusieurs plates-formes.

Vous pouvez prendre le code et l'utiliser dans vos applications,. la licence de la prochaine version est Ogre MIT

De cette façon, vous pouvez vous concentrer sur votre boucle de jeu et le code du jeu.


MISE À JOUR DE PRÉCISION HEURE: maintenant, si vous pouvez utiliser la dernière version de boost, il y a boost.chrono qui fournit une horloge de haute précision, steady_clock, qui est la plate-forme transversale et utilise QueryPerformanceFrequency et QueryPerformanceCounter sur les fenêtres . En fait, une proposition est chrono pour plus de la bibliothèque standard C de.

Autres conseils

L'exemple de code que vous avez fourni est la pire façon de mettre en œuvre une boucle de jeu. Comme vous l'avez remarqué, il est juste un énorme gaspillage d'attendre jusqu'à ce qu'il est temps de se rafraîchir.

Il suffit de choisir un pas de temps arbitraire (par exemple, une seconde par exemple) et d'exprimer toutes vos mesures relativement à cette étape de temps.

ressemblerait à ceci:

while ( !done )
{
    float alphaTime = timeConstant / (currentTime - lastLoopTime);
    dispatchEvents();
    gameLogic( alphaTime );
}

void gameLogic( float alphaTime )
{
    movePlayer( playerSpeed * alphaTime );
}

De cette façon, vous ne perdez pas de temps d'attente pour le framerate, vous pouvez laisser vos scripts AI fonctionne, ... et tout se déplace à la même vitesse, car les mouvements sont multipliés par le facteur temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top