05-08-2013, 11:25 AM
Un moteur physique à framerate variable va être ingérable... Il me semble que, par exemple, requestAnimationFrame peut attendre quasi-indéfiniement si jamais l'utilisateur est passé sur un autre onglet. Tu peux alors te retrouver avec un intervalle de plusieurs secondes (voire minutes). Ajouter un système dans la fonction lancée par rAF, pour découper l'intervalle de temps en sous-intervalle de X ms max chacune, pourrait alors être une solution... mais ce sera lourd! Suppose que l'onglet soit inactif 10 minutes, et que l'intervalle max soit de 50ms (20fps), on aurait alors 12.000 frames physiques à calculer d'un coup :o
Tout fusionner en un bloc ne me semble pas approprié quand même, car alors, l'un ralenti l'autre et on perd l'intérêt d'avoir la partie graphique pour le GPU et la partie physique pour le CPU (le GPU doit attendre que le CPU ait finit avant de savoir quoi afficher).
Si setInterval ne te plait pas, essaie plutôt un setTimeOut à la fin du loop physique. Mesure le temps entre deux loops physiques et fait les calculs en conséquence.
Pour la désynchronisation client / serveur, je ne me reposerai pas trop dessus quand même, surtout si tu n'as pas de marqueur absolue (le timestamp en ms par exemple). Si tu n'as que des marqueurs relatifs (le serveur fait un wait de 200ms puis calcule et recommence; le client fait un wait de 200ms, puis calcule puis recommence) alors tu as un soucis de synchronisation qui arrivera au niveau du calcul: le serveur ira plus ou moins vite que le client pour faire son calcul. Et si tu dis "toutes les 200ms, le serveur lance le calcul, toutes les 200ms, le client lance le calcul", alors il faudra t'assurer que le calcul ne dépassera pas 200ms, sinon, il y aura un loop infini. Les durées de calcul ne sont pas des données sur lesquels on devrait se reposer (je ne sais plus d'où sort cette "règle").
Tout fusionner en un bloc ne me semble pas approprié quand même, car alors, l'un ralenti l'autre et on perd l'intérêt d'avoir la partie graphique pour le GPU et la partie physique pour le CPU (le GPU doit attendre que le CPU ait finit avant de savoir quoi afficher).
Si setInterval ne te plait pas, essaie plutôt un setTimeOut à la fin du loop physique. Mesure le temps entre deux loops physiques et fait les calculs en conséquence.
Pour la désynchronisation client / serveur, je ne me reposerai pas trop dessus quand même, surtout si tu n'as pas de marqueur absolue (le timestamp en ms par exemple). Si tu n'as que des marqueurs relatifs (le serveur fait un wait de 200ms puis calcule et recommence; le client fait un wait de 200ms, puis calcule puis recommence) alors tu as un soucis de synchronisation qui arrivera au niveau du calcul: le serveur ira plus ou moins vite que le client pour faire son calcul. Et si tu dis "toutes les 200ms, le serveur lance le calcul, toutes les 200ms, le client lance le calcul", alors il faudra t'assurer que le calcul ne dépassera pas 200ms, sinon, il y aura un loop infini. Les durées de calcul ne sont pas des données sur lesquels on devrait se reposer (je ne sais plus d'où sort cette "règle").