J'ai lu que la vitesse des objets de jeu ne devrait pas être entravée par FPS mais devrait plutôt être basée sur le temps. Comment puis-je séparer le code de mise à jour / dessin pour maximiser les performances sans limiter le taux de dessin et fournir un taux de mise à jour logique constant en fonction du temps?
Mon pseudo-code actuel est le suivant
loop
{
draw();
if (ticksElapsed() > 100)
{
update();
ticks+= ticksElapsed();
}
}
Le problème est que le code de dessin entrave les performances du taux de mise à jour (). Et il consomme 100% de processeur car si le sommeil est interrompu, il supprime les deux fonctions de dessin / logique.
J'utilise également SDL et il ne semble pas avoir d'option vsync. J'ai également entendu parler des termes temps fixe et variable, mais je ne sais pas comment cela peut être fait avec sleep ()
la source
Réponses:
Dans votre extrait de code, il semble que vous essayez d'exécuter votre jeu en mode pas à pas fixe en attendant que votre dessin et votre mise à jour prennent moins de 15 ms (60 ips). C'est possible et vous avez bien deviné que cela ne peut pas être fait en utilisant un appel de sommeil parce que vous ne savez pas exactement combien de temps vous allez dormir. La boucle d'attente occupée est la bonne solution.
Cependant, considérez le cas où votre mise à jour et votre dessin dépassent 15 ms, vous devez maintenant ralentir le dessin et la mise à jour du jeu. Vous pouvez maintenant faire deux choses: détecter cet état et supprimer les images (sauter le dessin et passer directement à la mise à jour jusqu'à ce que vous soyez à nouveau synchronisé), mais si l'ordinateur est juste à ralentir, il ne rattrapera jamais.
Une autre solution consiste à rendre votre logique de mise à jour indépendante du temps fixe. Vous n'avez pas besoin d'un thread séparé pour cela, il vous suffit de spécifier à quelle vitesse les choses devraient évoluer. Au lieu de 5 pixels par tick, vous devez utiliser 50 pixels par seconde. Vous auriez besoin d'un minuteur de haute précision pour y parvenir, et toute votre logique de mise à jour devrait pouvoir accéder au minuteur pour voir combien de temps s'est écoulé depuis la dernière mise à jour.
Fondamentalement, vous passez de:
À
la source