Chronomètre en Ajax

Chronomètre en Ajax - PHP - Programmation

Marsh Posté le 17-06-2009 à 17:19:57    

Bonjour à tous, j'ai un petit problème de conception là :)
 
Je cherche en fait à faire pour un jeu en Javascript un chronomètre : le plus rapide sera sensé gagner. La précision doit être au millième de seconde.
Je souhaite que ce chronomètre s'affiche côté JS, à titre d'information, et c'est ce que je fais avec ceci :

Code :
  1. function setChrono() {
  2.     globalChrono++ ;
  3.     compte = setTimeout('setChrono()',1000) ;
  4.     remplirChrono(globalChrono) ; //pour mettre à jour l'affichage de la div
  5. }

Pas besoin d'être plus précis, à la seconde cela suffit.
 
Cependant, pour d'évidentes raisons de sécurité, le vrai décompte se fait côté PHP, avec des microtime(). Quand le jeu est fini, je fais le calcul pour en déduire le temps passé sur le jeu :

Code :
  1. function stopChrono() {
  2.     //on récupère le microtime stocké an lancement de la partie
  3.     $mtOld = $_SESSION['chrono'] ;
  4.     $mtNew = microtime() ;  
  5.  
  6.     //on explode les secondes et millisecondes
  7.     list($oldUsec, $oldSec) = explode(' ',$mtOld);
  8.     list($newUsec, $newSec) = explode(' ',$mtNew);
  9.     $oldMt = ((float)$oldUsec + (float)$oldSec);
  10.     $newMt = ((float)$newUsec + (float)$newSec);
  11.     
  12.     //on fait un arrondi au millième de seconde
  13.     //puis on découpera le string afin de résoudre le problème que si on a 1.200, on affiche 1.200 et pas 1.2
  14.     $chronoMt = (string)(round($newMt - $oldMt, 3) * 1000) ;    
  15.     $i = substr($chronoMt, 0, strlen($chronoMt)-3) ;
  16.     $d = substr($chronoMt, strlen($chronoMt)-3) ;
  17.     $chronoMt = $i . '.' . $d ;
  18.  
  19.     return  $chronoMt ;
  20. }


 
Le problème est que j'obtiens à la fin un décalage clair entre le JS et le PHP. Je peux ainsi obtenir sur le JS un temps de 69 secondes, et 72.214 secondes en PHP : le JS s'écoule plus lentement que le PHP. Ca se comprend un peu ( côté client moins fiable que côté serveur ), mais bon....
Evidemment cela peut troubler le joueur qui obtient un résultat différent de qu'il a vu.
 
Une solution je pense serait de passer par Ajax : régulièrement ( toutes les 5 secondes on va dire ), j'interroge le serveur, celui-ci me renvoit le décompte PHP en cours ( tronqué à la seconde cette fois-ci ), et j'écrase le décompte JS en cours avec celui-ci. Mais est-ce que je ne risque pas de surcharger le serveur ainsi ? Est-ce qu'on risque pas d'avoir des sautes du chrono JS ?
 
Ou bien existerait-il une autre solution ?
 
Merci d'avance pour vos lumières  :jap:  
 
PS : je ne savais pas où le mettre, dans la section JS ou PHP, alors je l'ai mis ici...


Message édité par DaSayan le 17-06-2009 à 17:22:18

---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
Reply

Marsh Posté le 17-06-2009 à 17:19:57   

Reply

Marsh Posté le 19-06-2009 à 00:59:38    

Pas de pistes ? :)


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
Reply

Marsh Posté le 19-06-2009 à 09:03:56    

Euh, le temps de réponse du serveur ?
T'a pas pensé au temps qu'il faut à l'information qui part du navigateur pour arriver jusqu'au serveur ?

Reply

Marsh Posté le 19-06-2009 à 11:24:52    

Euh non j'avais pas pensé à cela. Mais je ne vois pas vraiment le rapport entre le décalage qui se fait entre JS et PHP.


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
Reply

Marsh Posté le 19-06-2009 à 13:01:35    

Et bien, si JS doit prévenir php quand il a finit, il faut le temps que la requête parte du navigateur à l'intant T, qu'elle atteigne le serveur a l'instant T+lag_moyen, que le serveur la comprenne à T+lag_moyen+interpretation...
Si en plus t'a des firewalls sur le trajet...

Reply

Marsh Posté le 19-06-2009 à 16:47:33    

Bah en fait c'est pas la question qu'il a fini...
Tu as deux chronomètres lancés en meme temps coté JS et côté PHP. Plus le temps passe, plus les deux sont décalés. Or je veux me débrouiller pour avoir le même résultat à la fin, comment faire ? Comment synchroniser ?
 
Cela dit, je te rejoint sur l'histoire du lag  :jap:  


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
Reply

Marsh Posté le 19-06-2009 à 17:46:49    

DaSayan a écrit :

Bah en fait c'est pas la question qu'il a fini...
Tu as deux chronomètres lancés en meme temps coté JS et côté PHP. Plus le temps passe, plus les deux sont décalés. Or je veux me débrouiller pour avoir le même résultat à la fin, comment faire ? Comment synchroniser ?
 
Cela dit, je te rejoint sur l'histoire du lag  :jap:  


 
non, php = demarrage immediat, js = demarrage quand la page est arrivée chez le client et chargée generalement

Reply

Marsh Posté le 19-06-2009 à 17:50:01    

tomsoft a écrit :


non, php = demarrage immediat, js = demarrage quand la page est arrivée chez le client et chargée generalement

Donc si j'ai bien compris :
- Je me mange du lag au démarrage
- Je me mange du lag à chaque que je resynchronise les deux via Ajax.
 
Est-ce qu'il y existe une solution alors pour que l'affichage en JS reste cohérent avec ce qui est calculé côté PHP ? Que je n'obtienne pas 20s en JS et 24s en PHP ?


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
Reply

Marsh Posté le 19-06-2009 à 17:50:50    

je pense pas :jap:

Reply

Marsh Posté le 19-06-2009 à 18:35:31    

Alors il ne me reste plus qu'à abandonner l'affichage du score en JS pour plus de clarté...  :jap:
 
Merci à toi et à l0g4n pour votre aide !  :jap:


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed