Je fais un shmup pour iPhone et j'essaie de décider quel type de boucle de jeu utiliser. Je veux utiliser un pas de temps semi-fixe ou un pas de temps entièrement fixe.
Avec un pas de temps semi-fixe, je ferai zéro ou plusieurs appels de mise à jour (FIXED_INTERVAL) suivis d'un appel de mise à jour (dt) où dt <= FIXED_INTERVAL par boucle de jeu. Si je comprends bien, les inconvénients de cette méthode sont que ma logique de mise à jour physique (dt) sera plus difficile à programmer car je dois essentiellement assumer une variable dt pour chaque mise à jour. Et puis j'ai aussi entendu dire que chaque manche de mon jeu sera légèrement différente car les valeurs à virgule flottante ne sont pas les mêmes à chaque fois.
Ensuite, avec un pas de temps entièrement fixe, je fais zéro ou plusieurs appels de mise à jour (FIXED_INTERVAL) suivis d'un appel d'interpolation (dt / FIXED_INTERVAL) où dt <FIXED_INTERVAL par boucle de jeu.
Il semble donc que la grande décision que je dois vraiment prendre soit: est-ce que je veux relever le défi d'implémenter une mise à jour (dt) avec une variable dt ou est-ce que je veux relever le défi d'implémenter l'interpolation?
Maintenant, d'après ce que j'ai lu, la majorité des gens disent d'utiliser entièrement fixe et de faire l'interpolation. Mais quand je pense à l'implémentation de l'interpolation, il semble que je serais beaucoup plus complexe qu'une mise à jour (dt) avec une variable dt. En effet, si j'utilise l'interpolation, je dois me souvenir à la fois de l'état précédent et de l'état actuel. Donc, si je veux utiliser l'interpolation, je dois proposer une couche supplémentaire d'indirection qui résume des états de jeu individuels. Alors qu'avec un pas de temps semi-fixe où je n'ai pas à utiliser d'interpolation, je n'ai pas à proposer une abstraction d'état de jeu car il n'y a toujours qu'un seul état de jeu et ce sont simplement les "tableaux globaux" qui représentent mes ennemis, et l'ennemi balles etc.
Alors, quel est le choix le plus pratique: dois-je l'implémenter semi-fixe sachant que mes mises à jour physiques pourraient se compliquer avec la variable dt. Ou dois-je utiliser entièrement fixe et essayer de proposer une abstraction de l'état du jeu afin de pouvoir suivre l'état précédent et l'état actuel afin d'effectuer une interpolation?
Réponses:
Entièrement fixe
Vous perdez la plupart des avantages d'un pas de temps fixe lorsque vous lancez une étape variable une fois par image.
Noel Lopis a une grande écriture sur la façon dont il a mis en œuvre un pas de temps fixe dans son jeu Casey's Contraptions . En prime, il est un développeur d'iphone, bien que sa technique ne soit pas spécifique à l'iphone.
Quelques faits saillants de l'article
la source
Ce que vous appelez un pas de temps "semi-fixe" et "entièrement fixe" sont, à mon avis, tous les deux un pas de temps fixe - le dt que vous passez à votre
update
appel ne change pas entre les images.Donc, votre question est en fait "est-ce que je veux implémenter l'interpolation à des fins de rendu?" La réponse est: probablement pas .
L'interpolation est quelque chose que vous ne voudriez faire que si votre pas de temps fixe
update
est nettement différent de votre pas de temps ciblerender
. Il n'est pas rare pour les jeux qui ont uneupdate
phase intense d'appeler uniquementupdate
à, disons, 10 Hz, mais de rendre à plein débit.Puisque vous écrivez un shmup iPhone, ni votre
update
ni votrerender
besoin ne sont particulièrement gourmands en CPU; vous pouvez facilement verrouiller votre fréquence d'images à 30 Hz ou 60 Hz, sans vous soucier de la mise en œuvre, tout en conservant un jeu fluide.la source
dt
pourupdate
etrender
est la chose la plus simple qui fonctionnerait, mais généralement évitée lors de l'utilisation de moteurs physiques pour l'instabilité qu'elle provoque. Par conséquent, appelerupdate
avec un fixedt
et rendre au même rythme (tout en supprimant des images si votreupdate
exécution est longue) est généralement la chose la plus simple qui fonctionnerait. L'écriture de code pour interpoler des objets entre lesupdate
appels ajoute de la complexité à votre code; complexité que vous ajoutez pour résoudre aucun problème en particulier.