30Fermer32
GodzilLe 17/04/2010 à 13:30
GoldenCrystal (./28) :
./25 > Le truc c'est qu'un timer n'aura jamais une précision suffisamment bonne pour te permettre d'obtenir un rendu fluide.
Pour avoir un truc fluide, il y a d'autres méthodes, plus simples qu'un timer.
En fait, il suffit de compter le temps dans ta boucle principale. Avec un API précis bien sûr… Il te faut au moins une précision de l'ordre de 10ms, mais si tu peux avoir 1ms c'est encore mieux ^^int lastTime = …; // Obtenir le temps de référence (je suppose qu'on compte en millisecondes dans cet exemple) int newTime; int desiredInterval = 1000 / 60; // Si tu vises 60 FPS while (loop) { do { usleep(1); // Sleep(1) sous Windows… Tu as peut-être même un équivalent portable SDL ? … // Gestion des évènements newTime = …; // Obtenir le temps actuel } while (newTime - lastTime < desiredInterval); // On répète la boucle d'évènements tant qu'on a pas attendu assez newTime += desiredInterval; // On incrémente le temps de référence de la durée d'une frame fixe. … // Rendu }Par contre cet algo ne gère pas le frameskip. C'est pas forcément dur à ajouter, mais tu n'en auras pas besoin au début.
./27 > Et tu as raison !
Un truc qui bloque toutes les autres opérations sur le système même quand il fout rien, c'est ultra chiant…

Le probleme avec cette boucle, c'est que tu va consommer plus de CPU qu'il ne faut..

il vaux mieux partir sur (comme l'indique le siteduzero, meme si je n'ai aps fait comme ça moi ^^) une base de temps, ie 30ms d'attente, de mesurer le temps que la boucle a prise, et mesurer le temps reel de l'attente et au prochain cycle, avec le delta, fait (30ms + delta) etc...