Folco (./1739) :
C'est risqué de baser la synchronisation d'un jeu sur un framerate ?
Oui

SDL_gfx permet de fixer un fps constant (30 par défaut), ça ne devrait donc pas poser de problème ?Tu veux dire *limiter* le FPS, et pas fixer un FPS constant (PS: 60 FPS c'est toujours mieux que 30 ^^). Si la machine n'est capable que d'afficher 15 FPS, ça va plus bien marcher. En fait le mieux c'est de ne pas limiter le FPS, comme ça les graphismes sont mis à jour plus rapidement sur les machines qui en sont capables (Faut évidemment que ton jeu supporte d'afficher des graphismes fluides à 60 fps, car si tes sprites bougent à 30, l'intérêt est en effet limité)
Je veux juste éviter le phénomène de certains jeux oldies qui tournent à des vitesses hallucinantes parce que la synchro ne marche plusParce que ces jeux ne mesuraient pas le temps écoulé, ou bien ajustaient leur timings d'une manière kikoololesque. (Avec des boucles for vides par exemple

La meilleure façon de synchroniser pour que ça tourne partout de manière indépendante du matériel graphique (bon si le CPU est trop lent par contre, on n'y fera rien ^^) c'est d'utiliser des intervalles de temps fixes pour tes mises à jour. (Les intervalles de temps variable sont *hyper* sensibles au matériel, et ne pas utiliser d'intervalle de temps, n'en parlons même pas

Je reprends le code d'un ancien post:
/* 120 Hz */ #define f 120d /* f = 1 / T <=> t = 1 / f */ #define T (1d / f) float Update(float delta); void Render(); int main() { long oldTime, newTime; double xTime = 0; /* Parce que sur x86 les float ça sert a rien :p */ Initialiser(); oldTime = GetTickCount(); /* Je prend un timer de référence (en millisecondes) */ while true { newTime = GetTickCount(); xTime = Update(xTime + (newTime - oldTime) / 1000d); Render(); oldTime = newTime(); } } double Update(double delta) { while (delta > T) { delta -= T; /* Faire les calculs sur une durée écoulée T */ } /* Il reste du temps non utilisé, on s'en servira la fois prochaine */ return delta; } void Render() { /* Dessiner ce qu'il faut ici */ }