Comment dois-je écrire une boucle de jeu principale? [fermé]

130

Comment dois-je écrire une boucle de jeu principale? Quelles sont les choses que vous devriez faire dans la boucle de jeu et quelles sont les choses que vous ne devriez pas faire dans la boucle de jeu?

J'en ai écrit beaucoup, mais je n'ai jamais vraiment lu sur les boucles de jeu. Je suis sûr que je pourrais les améliorer considérablement, mais je ne sais pas comment.

hokiecsgrad
la source
4
Mauvaise réponse: Pourquoi ne pas utiliser le moteur de quelqu'un pour créer cette boucle pour vous? :)
user712092
vous pouvez demander à l'utilisateur le nombre total d'images qu'il souhaite exécuter et utiliser une boucle for pour la quantité de tampons n fois supérieure.
Uğur Gümüşhan

Réponses:

121

La boucle de jeu principale gère trois tâches principales:

  1. Obtenir la saisie de l'utilisateur
  2. Mettre à jour l'état du jeu
  3. Dessine le jeu

Une simple boucle de jeu regroupe ces trois tâches en une boucle while. Cela a des résultats indésirables:

  1. Le jeu fonctionne à différentes vitesses sur différents ordinateurs.
  2. Le processeur (peut être inutilement) indexé à 100% d'utilisation.
  3. Les "états du jeu" / menus sont manquants ou mélangés avec le code du jeu.
  4. La boucle de jeu principale est très longue et difficile à maintenir.
  5. Le code est difficile à étendre / à transférer vers d'autres plates-formes.

Les boucles de jeu avancées répondent aux problèmes énumérés ci-dessus. Voici quelques articles utiles:

Pour un excellent exemple de boucle de jeu, jetez un coup d’œil au jeu de démonstration Allegro Skater:

  • Le code de la boucle de jeu est dans framework.c .
  • Parcourir le code source complet ici .

Les boucles de jeu font souvent le même type de travail pour la plupart des jeux, alors je réfléchissais à un moyen de créer un cadre de jeu généralisé. Il est préférable d'écrire une mise en œuvre d'une boucle de jeu et de la partager entre les jeux. Il enregistre le travail lors de la création d'un nouveau jeu et les améliorations apportées à la boucle de jeu partagée peuvent être partagées par tous les jeux (par exemple, l'ajout d'un compteur FPS ou d'une fonction de capture d'écran).

Leftium
la source
1
Oui, comme on peut le supposer, je peux certainement apporter des améliorations. Bonnes lectures. Merci également d'avoir posté le code. C'est formidable de voir le code du jeu avec ce genre de choses.
hokiecsgrad
1
Le processeur doit être bloqué à 100% d'utilisation (ou plus comme 50% si vous avez au moins 2 cœurs). Pensez-y. Comment allez-vous avoir une physique de pointe, des graphismes époustouflants, si vous restez assis à vous dire: "Oh, mais je ne veux pas utiliser tout le processeur." Oui, vous devriez utiliser 100% du processeur si possible (cela signifie que le multithreading sur les ordinateurs modernes, il est donc très difficile d'utiliser 100% de 4 cœurs à tout moment). Tirez le meilleur parti de la machine sur laquelle vous utilisez que vous pouvez.
Bobobobo
5
Permettez-moi d'ajouter: Pour les programmes de bureau . Sur un appareil portable, vous utiliserez beaucoup plus de batterie, vous vous inquiétez donc de l'utilisation à 100%.
Bobobobo
1
@ user6003859: J'ai corrigé le lien.
Leftium
1
un autre lien utile: gameprogrammingpatterns.com/game-loop.html
brita_
51

Je recommanderais l'article de Glenn Fiedler sur l'indépendance du framerate, " Fix Your Timestep! "

(Moins pertinent pour le sujet à traiter, mais les autres articles de la série sont également assez bons - comme tout sur son site!)

Neverender
la source
Ce sont certainement de très bons articles. Merci d'avoir posté!
hokiecsgrad
1
J'approuve la recommandation d'une implémentation indépendante robuste du framerate. Tout dans votre jeu doit être implémenté en tant que valeur delta que vous mettez à jour périodiquement. Et cela ne devrait pas nécessairement être fait en même temps que vous avancez à la trame suivante. En fait, si vous avez sauté un cadre, vous ne voudrez probablement pas simplement appeler vos méthodes de mise à jour avec un delta 2x. Il serait plus cohérent d’appeler votre mise à jour deux fois avec le même delta. Prenez le temps d'apprendre les problèmes liés à votre nombre d'images par seconde et à votre cycle de mise à jour. Cela vous fera gagner du temps plus tard.
Dennis Munsie