2Fermer4
GoldenCrystalLe 05/07/2008 à 00:15
En fait, le problème du "time-based" c'est tout ce qui se passe dès lors que tu programmes sur une plateforme "non unique" (au hasard un PC).
pour avoir déjà été confronté au problème, tu peux effectivement résoudre des équations comme le suggère Jyaif (en fait c'est ce que j'aurai fait il y a pas si longtemps que ça) mais le problème c'est que ce n'est pas vraiment dynamique:
Tu appliques des formules physiques qui contiennent des approximations, ce qui te donne une formule, qui n'est valable qu'à un moment donné (hé oui) et qu'il faudrait changer 'en temps réel'. Donc c'est même au delà d'une équation différentielle, car il faut arriver a recoller les bouts, et à priori sur deux pc différents tu pourrais avoir pour une scène programmée (mais pas précalculée wink) qui donnerait un résultat totalement différent (théorie du chaos si je ne dis pas de bêtises ?) à cause de petites imprécisions de temps qui s'accumulent. (Bon après je suis pas expert mais voilà)

La façon dont je vois les choses c'est de fonctionner exactement sur le même modèle que les "frame", mais là où dans le cas "frame based" tu basait ton timing sur les "frame", tu feras l'inverse.
En gros tu découpe ton temps en intervalles de durée T (donc fréquence 1/T trioui) fixe, et tu fonctionne... ben comme la méthode d'Euler quoi grin
Je donne le pseudo-code C car sinon j'y arriverais pas sans faire un pâte pas beau grin

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


Enfin bon c'est comme ça que je vois les choses. Plus tu prend T petit plus tu augmentes la précision et la quantité de calculs. Mais les calculs restent bien plus simples qu'avec des intégrales "exactes", donc ça devrait être plus efficace si tu sait choisir le bon T.