1739Fermer1741
GoldenCrystalLe 25/11/2010 à 15:06
Folco (./1739) :
C'est risqué de baser la synchronisation d'un jeu sur un framerate ?

Oui tongue
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 plus grin
Parce 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 trioui)

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 grin)
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 */
}