Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1363 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Chronomètre en Ajax

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Chronomètre en Ajax

n°1896365
DaSayan
Posté le 17-06-2009 à 17:19:57  profilanswer
 

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.
mood
Publicité
Posté le 17-06-2009 à 17:19:57  profilanswer
 

n°1896801
DaSayan
Posté le 19-06-2009 à 00:59:38  profilanswer
 

Pas de pistes ? :)


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
n°1896817
l0g4n
Expert en tout :o
Posté le 19-06-2009 à 09:03:56  profilanswer
 

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 ?

n°1896881
DaSayan
Posté le 19-06-2009 à 11:24:52  profilanswer
 

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.
n°1896920
l0g4n
Expert en tout :o
Posté le 19-06-2009 à 13:01:35  profilanswer
 

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...

n°1897033
DaSayan
Posté le 19-06-2009 à 16:47:33  profilanswer
 

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.
n°1897073
tomsoft
Posté le 19-06-2009 à 17:46:49  profilanswer
 

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

n°1897075
DaSayan
Posté le 19-06-2009 à 17:50:01  profilanswer
 

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.
n°1897077
tomsoft
Posté le 19-06-2009 à 17:50:50  profilanswer
 

je pense pas :jap:

n°1897092
DaSayan
Posté le 19-06-2009 à 18:35:31  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Chronomètre en Ajax

 

Sujets relatifs
problème taille <div> avec Ajax.autocompleter[Résolu] Plusieurs argument dans une url fonction js ajax
[AJAX/PHP] Executer du javascript provenant d'un php[PHP] Client/serveur PHP et Ajax
Ajax asynchroneAJAX fonction globale?
Probleme ajax listes liéesRécupérer variables de javascript en php (Ajax)
Récupérer variables de javascript en php (Ajax)Ajax ne marche pas sous firefox
Plus de sujets relatifs à : Chronomètre en Ajax


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR