Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Synchronisation des données client-serveur et sf::clock  (Lu 5995 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Synchronisation des données client-serveur et sf::clock
« le: Mai 18, 2013, 10:14:36 am »
J'ai un sf::clock pour le client et un autre pour le serveur, à chaque tour de boucle côté client et côté serveur je remets à jour la position du personnage en fonction du temps écoulé.
Toutes les secondes j'envoie une requête au serveur pour remettre à jour la position du personnage côté client en tenant compte de la latence.
Mais avec le même algorithme côté client et serveur pour déplacer mes personnages je me retrouve avec des positions complètements différentes au même moment du coup mes déplacements sont, bizarres on a l'impression que le personnage avance puis recule, bref...

La classe sf::clock est elle adaptée pour faire ce genre de chose, ou dois je procéder d'une autre manière ?

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #1 le: Mai 18, 2013, 06:46:46 pm »
Erf...en plus mon PC se met en hibernation, je ne sais pas vraiment si c'est le fait que je ne possède pas vraiment de serveur dédié pour les applications..., ou bien...

Eroy

  • Jr. Member
  • **
  • Messages: 60
    • Voir le profil
    • E-mail
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #2 le: Mai 18, 2013, 08:56:43 pm »
Le sf::Clock a rien de particulier et a rien à voir avec tes soucis.

Commence par t'en foutre du temps réel, déjà affiche des déplacements visible entre les deux clients mais avec la latences, une foi que t'auras ça tu pourras travailler sur les prédictions de déplacements, n'essaies pas de tout faire d'un coup.  ::)

Mais quand tu parles de "même algorithme côté client et serveur" je me dis que tu devrais aller lire des articles sur la conception de serveur de jeu.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #3 le: Mai 19, 2013, 05:51:52 pm »
Citer
Mais quand tu parles de "même algorithme côté client et serveur" je me dis que tu devrais aller lire des articles sur la conception de serveur de jeu.
Justement, j'en cherche!
Le temps de latence ne me pose pas vraiment de soucis, ce qui me pose le plus de problèmes c'est pour faire les prédictions de déplacements.
Je n'ai pas trouvé d'article à ce sujet à part un qui disait qu'il faut envoyer certaines données dans le paquet.
Bref je vais essayer de stocker la position courante et la position suivante qui sera récupérée par le serveur, et faire une interpolation de la position avec le client..., d'après ce que j'ai compris du peu d'articles traitant sur le sujet, c'est ça qu'il faut faire.

Eroy

  • Jr. Member
  • **
  • Messages: 60
    • Voir le profil
    • E-mail
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #4 le: Mai 19, 2013, 11:30:30 pm »
Ouais j'avoue que ça doit pas forcément être simple à trouver..

Dans tous les cas il faut réduire un maximum les calcules que le serveur doit réaliser sans pour autant que ça impact la "sécurité" (triche...). Mais bon, on peut pas dire que se soit le plus simple à faire le prédictions, à ce que j'ai entendu c'est même le plus compliqué.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #5 le: Mai 20, 2013, 03:57:02 pm »
Ouais, j'ai essayer de faire un système qui prédit la position du personnage à la prochaine requête en fonction du temps de latence et du temps écoulé entre 2 requêtes que je défini moi même pour éviter de surcharger la bande passante et je fais un calcul en fonction du temps total (temps entre 2 requêtes + temps de latence.) et du temps écoulé depuis la dernière requête, et là j'ai la position du personnage qu'il aurait sur le serveur à l'instant T, ça me donne des mouvements pas très fluide comme si ça laguait..., bref, j'ai du mal avec ce genre de chose, je donc aller chercher un peu d'aide sur d'autres forums..., sinon, je ne m'en sortirai pas pour avoir un résultat acceptable. :/


domoi

  • Newbie
  • *
  • Messages: 9
    • Voir le profil

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #7 le: Mai 21, 2013, 10:40:43 am »
Merci pour ces liens, je vais essayer d'implémenter cela mais avant il faut que je passe en udp. ^^

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #8 le: Mai 22, 2013, 06:26:35 pm »
Voila j'ai un moteur réseau qui fonctionne en TCP et en UDP, maintenant, il faut que j'essaye la méthode expliquée dans l'article sur le 1er lien que tu m'as passé, parce que ma méthode ne marche pas, c'est trop lent. :/

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #9 le: Mai 25, 2013, 12:30:08 pm »
Bon, je ne fais pas du tout comme lui, car dans son algorithme il semblerait qu'il envoie une demande de mise à jour de la position du personnage et de la physique à chaque tour de boucle.
Moi j'ai fait un système plus complexe qui peut prédire la position du personnage  à n'importe quel moment dans le futur en fonction du temps de transfert et du temps écoulé entre 2 mises à jours (ce temps là je le paramètre moi même, plus il est élevé, moins ça surchargera la bande passante.)

Le plus dur c'est de faire les prédictions pour les déplacement à la souris, car, j'ai un chemin qui est en fait un ensemble de segments et en fonction du temps je dois trouvé sur quel segment il se trouverais sur le serveur et à quel position sur ce segment et après je fais une correction si le temps de latence est plus long ou plus cours par rapport au temps de latence précédent.


Bref mon algorithme semble fonctionner, j'ai testé avec les mouvements au clavier et pas de problème mais j'ai encore un soucis avec les déplacements à la souris.

J'ai testé sans faire de prédiction, donc, en récupérant bêtement les données que le serveur me renvoie, et hum..., j'ai par moment des déplacements bizarre.
J'ai regardé donc les valeurs des données reçue du serveur, quand c'est des déplacement au clavier pas de problème car la direction est toujours un vecteur de nombre entier mais quand j'envoie des float sur le réseau. (Ce sont des float que je converti en string avant d'envoyer les données puis que je reconverti en float quand je reçois les données.)
Parfois je me retrouve avec des directions bizarre du genre (-0,0) hors que je ne mets jamais à 0 la direction du personnage quand il ne bouge pas car j'en ai besoin pour déterminé le sens vers lequel le personnage doit regarder.
« Modifié: Mai 25, 2013, 12:31:53 pm par Lolilolight »

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #10 le: Mai 25, 2013, 06:12:13 pm »
pour ta souris tu peu sortir un vecteur aussi , tout les 5ms par exemple tu compares l'ancienne et la nouvelle position , et tu as un vecteur direction / vitesse.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #11 le: Mai 29, 2013, 02:20:10 pm »
Bah pour les déplacements à la souris j'ai un ensemble de vecteurs et pas un seul vecteur car il ne faut pas qu'il traversent les cases ou il y a collision.
Cet ensemble de vecteurs je le récupère grâce à un algorithme de pathfinding.
Bon mon système n'est pas encore parfais mais je pense savoir d'ou vient le bug, car ça bug quand je fais des déplacements trop long à la souris, en fait, c'est parce que quand j'envoie trop de donnée en un seul packet, la SFML n'en veut pas. (Je pensais que la taille des paquets n'était limitée que en UDP et pas en TCP mais apparemment non...)
C'est le tutoriel qui m'a un peu induis en erreur. :/
Donc je dois faire un vecteur par paquet et non tout les vecteurs dans le même paquet.
Et j'ai fait deux fonctions côté client dans mon moteur réseau, une qui attend d'avoir les données reçues avec un timeout (si il faut absolument que certaines données soit reçue pour effecteur certains traitement.) et une qui vérifie si une donnée à été reçue, si pas elle revoie faux et rend la main.
Et je fais précéder chaque message par un tag pour récupérer les bonnes données dont j'ai besoin dans la pile de messages reçu.
Et depuis que je fais ça, plus de problème. :)
Mais bon c'est pas mal comme ça parce que avec le système de cryptage je ne peux de toute façon pas envoyer trop de données d'un coup.



Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #12 le: Mai 29, 2013, 02:32:46 pm »
Citer
quand j'envoie trop de donnée en un seul packet, la SFML n'en veut pas
SFML en veut, si ça foire c'est qu'il se passe quelque chose de bizarre dans les couches bas niveau. Mais normalement TCP ne devrait pas être gêné par un gros paquet, puisqu'il peut le découper en autant de petits paquets qu'il le souhaite si nécessaire.
Tu devrais faire des tests plus poussés sur ce problème, en dehors de ton application.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #13 le: Mai 29, 2013, 05:26:22 pm »
Citer
Mais normalement TCP ne devrait pas être gêné par un gros paquet, puisqu'il peut le découper en autant de petits paquets qu'il le souhaite si nécessaire.

C'est bien ce que je pensais au niveau de comment ce protocole devrait fonctionner, bref, je vais faire des tests plus poussés en console on verra bien, avec et sans cryptage.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Synchronisation des données client-serveur et sf::clock
« Réponse #14 le: Juin 02, 2013, 10:50:02 am »
Bon j'ai un problème avec les temps apparemment.

Car quand je calcule le temps de transfert des données entre le client et le serveur pour faire l'approximation de la position du personnage à la mise à jour suivante, et puis quand je fais la mise à jour, le personnage est toujours un peu plus loin sur le client que sur le serveur.

Comme si la classe sf::clock irait plus vite sur le serveur que sur le client.

A cause des threads peut être le temps renvoyé par sf::clock n'est pas tout à fait exact.

Bref je vais lire l'article qu'on m'a passé ou il stocke 100 mouvements dans un tableau, la solution est peut être là.

En fait non il fait la même chose que moi mais au lieu de stocker un move il en stocke 100. (Et je ne comprend pas pourquoi il en stocke autant.)

Comment tu fais toi pour calculer le temps de latence avec la SFML ?
Moi je calcule le temps entre le moment ou il envoie un message et le moment ou il le reçois.






« Modifié: Juin 02, 2013, 11:05:41 am par Lolilolight »