J'ai récemment lu cet article sur les boucles de jeu: http://www.koonsolo.com/news/dewitters-gameloop/
Et la dernière mise en œuvre recommandée me déroute profondément. Je ne comprends pas comment cela fonctionne, et cela ressemble à un gâchis complet.
Je comprends le principe: mettre à jour le jeu à une vitesse constante, avec ce qui reste rendre le jeu autant de fois que possible.
Je suppose que vous ne pouvez pas utiliser:
- Obtenez une entrée pour 25 ticks
- Jeu de rendu pour 975 ticks
Approche puisque vous obtiendriez une entrée pour la première partie de la seconde et que cela vous semblerait bizarre? Ou est-ce ce qui se passe dans l'article?
Essentiellement:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
Comment est-ce même valable?
Assumons ses valeurs.
MAX_FRAMESKIP = 5
Supposons que next_game_tick, qui a été affecté quelques instants après l'initialisation, avant que la boucle de jeu principale ne dise ... 500.
Enfin, comme j'utilise SDL et OpenGL pour mon jeu, avec OpenGL utilisé uniquement pour le rendu, supposons que GetTickCount()
renvoie le temps écoulé depuis l'appel de SDL_Init, ce qu'il fait.
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
Source: http://www.libsdl.org/docs/html/sdlgetticks.html
L'auteur suppose également ceci:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
Si nous développons la while
déclaration, nous obtenons:
while( ( 750 > 500 ) && ( 0 < 5 ) )
750 car le temps s'est écoulé depuis qu'il a next_game_tick
été attribué. loops
est nul comme vous pouvez le voir dans l'article.
Nous avons donc entré la boucle while, faisons un peu de logique et acceptons une entrée.
Yada yada yada.
À la fin de la boucle while, je vous rappelle que notre boucle de jeu principale est la suivante:
next_game_tick += SKIP_TICKS;
loops++;
Mettons à jour à quoi ressemble la prochaine itération du code while
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000 car le temps s'est écoulé pour obtenir des données et faire des choses avant d'atteindre la prochaine inétération de la boucle, où GetTickCount () est rappelé.
540 car, dans le code 1000/25 = 40, donc, 500 + 40 = 540
1 parce que notre boucle a répété une fois
5 , vous savez pourquoi.
Donc, puisque cette boucle While est CLAIREMENT dépendante MAX_FRAMESKIP
et non pas TICKS_PER_SECOND = 25;
comment le jeu est-il censé fonctionner correctement?
Ce n'était pas une surprise pour moi que lorsque j'ai implémenté cela dans mon code, je pourrais ajouter correctement car j'ai simplement renommé mes fonctions pour gérer les entrées utilisateur et dessiner le jeu selon ce que l'auteur de l'article a dans son exemple de code, le jeu n'a rien fait .
J'ai placé un fprintf( stderr, "Test\n" );
à l'intérieur de la boucle while qui n'est pas imprimé jusqu'à la fin du jeu.
Comment cette boucle de jeu fonctionne-t-elle 25 fois par seconde, garantie, tout en rendant le plus rapidement possible?
Pour moi, à moins que je manque quelque chose d'énorme, cela ressemble à ... rien.
Et cette structure, de cette boucle while, n'est-elle pas censée fonctionner 25 fois par seconde puis mettre à jour le jeu exactement ce que j'ai mentionné au début de l'article?
Si tel est le cas, pourquoi ne pourrions-nous pas faire quelque chose de simple comme:
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
Et comptez pour l'interpolation d'une autre manière.
Pardonnez ma question extrêmement longue, mais cet article m'a fait plus de mal que de bien. Je suis gravement confus maintenant - et je n'ai aucune idée de comment implémenter une boucle de jeu appropriée en raison de toutes ces questions.