IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Synchronisation entre client et server // gestion du lag


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Synchronisation entre client et server // gestion du lag
    Hello,

    Je continue mon jeu en réseau avec la librairie SDL et SDL_Net.

    J'ai fait évolué la gestion de l'envoie des données entre le client et le serveur :

    Au tout debut, le client envoyait l'etat des touches sur lesquels ils appuyait toutes les X millisecondes, au serveur, qui calculait la nouvelle position et renvoyait a tous les clients cette position. cependant il y avait un lag, je pense que trop de données etaient envoyées.

    J'ai amélioré ce systeme : le client envoie l'etat des touches qui changent uniquement(par exemple si j'appuie sur gauche et que je maintiens, je n'envoie que le paquet correspondant au changement, au lieu d'envoyer en continue l'information "gauche"). A partir de ce moment, le serveur ET le client calcule les nouvelles positions, jusqu'a qu'un autre changement de touche interviennent, la, le serveur envoie la position finale, et le client se cale dessus. En gros le client essai de prevoir la position du personnage sur la map, avant d'avoir confirmation du serveur (et pendant toute la periode ou j'appuie sur gauche et que je maintiens, aucune information n'est envoyée !)

    Le probleme etant que, du coté du serveur comme du coté client, il faut une frequence de mise a jour de la position. Les 2 se font en meme temps, mais la machine sur laquelle etant le client, et celle sur laquelle etant le serveur, n'etant pas forcement de la meme puissance, il y a parfois de forte differences entre la position estimée par le client, et la position reelle envoyée par le serveur, surtout lorsqu'il y a plusieurs clients connecté au serveur (celui ci doit alors effectuer + de calcul ce qui diminue la frequence).

    Je cherche donc un moyen de synchroniser tout ca pour avoir la meme frequence coté client que coté serveur.

    Quelqu'un aurait t'il une idée?

    PS : j'utilise encore le TCP, donc il n'y a a priori pas de perte de paquets en route !

  2. #2
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Hello.

    Il serait peut-être utile, de temps à autre (toutes les 2 secondes par exemple), que le bidule qui détient la "vraie" position/vélocité d'un objet envoie cela aux autres bidules, via UDP.

    UDP parce que c'est moins gourmand en bande passante et que c'est pas grave si un paquet se perd de temps à autre.

    TCP devrait être réservé aux infos qui doivent arriver. On se rend compte, quelques fois, que certaines infos peuvent être perdues sans conséqunce grave.

    J'avais lu, à l'époque, le témoignage d'un développeur de XvT (X-Wing vs. Tie Fighter) qui regrettait l'emploi exclusif de TCP dans le jeu...

    A+
    Glob
    What would you do if you were not afraid?

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par phraides
    J'ai amélioré ce systeme : le client envoie l'etat des touches qui changent uniquement(par exemple si j'appuie sur gauche et que je maintiens, je n'envoie que le paquet correspondant au changement, au lieu d'envoyer en continue l'information "gauche"). A partir de ce moment, le serveur ET le client calcule les nouvelles positions, jusqu'a qu'un autre changement de touche interviennent, la, le serveur envoie la position finale, et le client se cale dessus. En gros le client essai de prevoir la position du personnage sur la map, avant d'avoir confirmation du serveur (et pendant toute la periode ou j'appuie sur gauche et que je maintiens, aucune information n'est envoyée !)
    C'est ce qui est conseillé mais généralement le serveur envoit une information de temps en temps pour que le client soit sûr d'être bon...

    Le probleme etant que, du coté du serveur comme du coté client, il faut une frequence de mise a jour de la position. Les 2 se font en meme temps, mais la machine sur laquelle etant le client, et celle sur laquelle etant le serveur, n'etant pas forcement de la meme puissance, il y a parfois de forte differences entre la position estimée par le client, et la position reelle envoyée par le serveur, surtout lorsqu'il y a plusieurs clients connecté au serveur (celui ci doit alors effectuer + de calcul ce qui diminue la frequence).
    Sauf si je me trompe :
    Ta mise à jour de la position est en fonction de la puissance de l'ordinateur? Pourquoi ne pas le faire en fonction du temps? L'ordinateur le moins puissant n'arrivera pas à avoir un mouvement aussi fluide mais au moins les objets seront toujours à la même vitesse...

    Je cherche donc un moyen de synchroniser tout ca pour avoir la meme frequence coté client que coté serveur.

    Quelqu'un aurait t'il une idée?
    Utiliser le temps!

    Jc

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Si je comprends bien, ce que tu as est,

    Si le joueur A envoie "gauche" au server
    client -> avance "1 fois"
    serveur -> avance "1 fois" - le temps de latence client-serveur *2 (aller-retour information)
    serveur -> envoie l'information aux autres clients (nouvelles coordonnées du joueur A)

    Donc si l'opération se répète (le joueur A envoie "gauche" au server) alors que la réponse du serveur n'a pas été reçue, ton joueur recul, et avance de nouveau.

    Pourquoi ne pas indiquer "START avance gauche" (a tel timespan), "STOP avance gauche" (a tel timespan)

    (+ d'autres infos, accélération ou autres)

    le client avance dans "son coin", le serveur calcul les coordonnées un peu en retard du client, et indique le point d'arrivé du joueur. Ensuite Synchronisation du client via le serveur sur le point d'arrivé.

    Cela donne

    client start -> avance gauche -> stop au point X
    500 ms + tard, confirmation que le joueur est arrivé au point X par le serveur

    Il ne devrait plus avoir de lag lorsque tu avances. Par contre une désynchronisation visuel des clients (qui ne sont jamais synchronisé parfaitement de toute façon)

Discussions similaires

  1. [JVM]Différences entre client et server
    Par ssaunois dans le forum Général Java
    Réponses: 4
    Dernier message: 11/02/2010, 17h33
  2. Synchronisation entre mobile et server
    Par des001 dans le forum Développement Mobile en Java
    Réponses: 0
    Dernier message: 15/04/2009, 11h49
  3. Synchronisation entre plusieurs base SQL Server
    Par vivoli12 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 19/05/2007, 13h47
  4. Réponses: 7
    Dernier message: 16/11/2006, 08h49
  5. Partage Internet entre clients Xp et 2003 Server
    Par rico76 dans le forum Windows Serveur
    Réponses: 8
    Dernier message: 29/09/2006, 02h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo