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

Réseau et multijoueurs Discussion :

Communication client/serveur mmorpg quelles données à envoyer?


Sujet :

Réseau et multijoueurs

  1. #1
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut Communication client/serveur mmorpg quelles données à envoyer?
    Bonjour à tous,

    Je parcour depuis plusieurs jours le forum pour me renseigner et avoir toutes les billes pour mon mmorpg.
    A l'heure actuelle, j'ai définis comme il fallait mon protocole et mes connections sont implémentés.
    Mais après plusieurs jours de casse-tete, je me pose une question fondamentale:
    Est-ce que toute les données que j'envois et reçois de mon serveur sont utiles?

    Je cherche surtout des réponses sur les données qui seront échangés entre le serveur et le client:
    Les item/position des joueurs/message des joueurs .... sont indispensable évidemment.
    Mais lors d'un déplacement d'un joueur, est-il utile d'envoyer les coordonnnées de chaque déplacements (ie chaque case où le joueur passe) ou juste une case de départ et une case d'arrivé et c'est le client qui calcul le reste?
    En gros la question principal réside surtout sur la fonction du client:
    Doit-il juste afficher les données envoyées au serveur, ou doit-il quand meme effectué des calcul, comme le mouvement des joueurs, la place des items dans l'inventaire, et d'autre petit détails.
    Lors d'un clique pour le rammassage d'une ressource, est-ce le client qui vérifie la position puis le serveur? ou le serveur uniquement? pourquoi faire un doublecheck?

    D'où ma question principale:
    Quelles données doit-on échanger entre le serveur et le clients, afin qu'un minimum d'information soit échangé, mais qu'un maximum d'action soit vérifié par le serveur?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par skeud Voir le message
    Bonjour à tous,

    Je parcour depuis plusieurs jours le forum pour me renseigner et avoir toutes les billes pour mon mmorpg.
    A l'heure actuelle, j'ai définis comme il fallait mon protocole et mes connections sont implémentés.
    Mais après plusieurs jours de casse-tete, je me pose une question fondamentale:
    Est-ce que toute les données que j'envois et reçois de mon serveur sont utiles?

    Je cherche surtout des réponses sur les données qui seront échangés entre le serveur et le client:
    Les item/position des joueurs/message des joueurs .... sont indispensable évidemment.
    Mais lors d'un déplacement d'un joueur, est-il utile d'envoyer les coordonnnées de chaque déplacements (ie chaque case où le joueur passe) ou juste une case de départ et une case d'arrivé et c'est le client qui calcul le reste?
    Sur ce point spécifique, la réponse est "non". Ceci dit, ta seconde solution n'est pas faisable (elle suppose que tu connais la case d'arrivée, ce qui implique qu'il te faut attendre que le joueur qui se déplace l'atteigne, ce qui crée une latence ingérable dans un jeu online).

    En fait, la bonne réponse à ce problème porte un nom : dead reckoning (en frenchy : navigation à l'estime, http://fr.wikipedia.org/wiki/Navigat...%A0_l%27estime).

    Citation Envoyé par skeud Voir le message
    En gros la question principal réside surtout sur la fonction du client:
    Doit-il juste afficher les données envoyées au serveur, ou doit-il quand meme effectué des calcul, comme le mouvement des joueurs, la place des items dans l'inventaire, et d'autre petit détails.
    le client est un système d'affichage des informations en provenance du serveur, et un système de contrôle envoyant des requêtes au serveur. Le client n'a pas à calculer quoi que ce soit, car tout calcul qu'il pourrait faire a des chances de se révéler faux au moment où il obtiens son résultat. Les seuls opérations locales qu'il est autorisé à faire sont :
    * l'affichage (qui nécessite bien évidemment des calculs, mais ces calculs sont basés sur des informations obtenues du serveur)
    * la réponse aux entrées du joueur (requête envoyée au serveur, résultat récupéré et affiché)

    Toute autre service rendu par le client risque d'être désynchronisé de ce qui est présent sur le serveur, et donc potentiellement faux. De plus, un client malicieux pourrait modifier l'état du jeu si trop de responsabilité est donnée au client.

    Citation Envoyé par skeud Voir le message
    Lors d'un clique pour le rammassage d'une ressource, est-ce le client qui vérifie la position puis le serveur? ou le serveur uniquement? pourquoi faire un doublecheck?
    Le client commence l'animation, dit au serveur "je veux prendre cette ressource", le serveur lui réponds (oui, non, tu en récupère X) et le client termine l'action. Le double check n'a pas lieu d'être, car seul le serveur est au courant de l'état à un instant t - le client n'en a qu'une approximation, mise à jour lorsque le serveur daigne lui envoyer des informations.


    Citation Envoyé par skeud Voir le message
    D'où ma question principale:
    Quelles données doit-on échanger entre le serveur et le clients, afin qu'un minimum d'information soit échangé, mais qu'un maximum d'action soit vérifié par le serveur?
    Toutes les données liées au gameplay, ayant une chance d'affecter non seulement le joueur mais aussi les autres joueurs ou le monde doit passer par le serveur. Toute donnée n'ayant qu'une importante locale peut rester sur le client.

    Un exemple typique : la visibilité. A un instant donné, le joueur voit tous les autres joueurs et PNJ/monstres qui sont dans son champ de vision, sauf ceux qui sont cachés par quelque chose. Ce n'est pas au client de déterminer ceux qui lui sont cachés - c'est le serveur qui le détermine - sans quoi, un joueur un peu malin va modifier tel ou tel shader pour afficher les monstres qui ne sont normalement pas visibles. Cela implique que le serveur a la même connaissance de la géométrie que le client (ce qui a un coût non négligeable en 3D).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    D'accord, merci pour ces précisions.Dans mon cas, je pars sur un jeux dont le serveur ne doit pas avoir la connaissance de l'affichage, je veux dire par là:
    Peu importe le client (2D, 2d iso, 3D), je veux que les échanges entre le serveur et le client restent les même, est-ce possible?

    Ensuite pour le déplacement des joueurs, je ne comprends pas pourquoi le serveur devrait avoir connaissance de toutes les position d'un joueur, seul le mouvement entre la case de départ et la case d'arrivée me semble importante à partager.

    si je devais envoyer toutes les positions intermédiaire, mon serveur serait submergé par tant d'informations.

    Pour précision, les déplacements ne sont pas forcément hyper important, étant donnée qu'ils n'influe pas sur le gameplay mais seulement sur l'affichage des joueurs sur une map.

    Mon jeu étant découpé en plusieurs map, chaque map fesant 10/10 cases. je pensais que lorsqu'un joueur veut passer de la case 2/2 à la case 4/4, le client envoit seulement l'information: je bouge à la case 4/4, le serveur sait donc que dans 2seconde, mon client sera à la case 4/4 (si on prend comme unité de mouvement, 1 case / seconde). Ensuite c'est au client de calculer le mouvement pour que le déplacement soit fluide à l'écran (pour éviter que mon joueur "saute" d'une case à une autre).

    Lorsque je joue à des jeu de ce type, il est fréquent que mon personnage commence à se déplacer puis corrige sa trajectoire en fonction des informations du serveur, en utilisant le Dead reckoning. Qu'en penses-tu?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par skeud Voir le message
    D'accord, merci pour ces précisions.Dans mon cas, je pars sur un jeux dont le serveur ne doit pas avoir la connaissance de l'affichage, je veux dire par là:
    Peu importe le client (2D, 2d iso, 3D), je veux que les échanges entre le serveur et le client restent les même, est-ce possible
    Aucun rapport : le serveur a besoin de connaître la géométrie pour valider ce que les clients lui communique. Il se moque de l'affichage.

    Citation Envoyé par skeud Voir le message
    Ensuite pour le déplacement des joueurs, je ne comprends pas pourquoi le serveur devrait avoir connaissance de toutes les position d'un joueur, seul le mouvement entre la case de départ et la case d'arrivée me semble importante à partager.
    Donc, s'il faut 30s à ton joueur pour aller de la case départ 1 à la case d'arrivée B, alors ton serveur (qui a besoin des 2 infos) aucun client ne peut tracker le joueur entre le moment où il part et le moment où il arrive. 30s d'incertitude, c'est long.

    Citation Envoyé par skeud Voir le message
    si je devais envoyer toutes les positions intermédiaire, mon serveur serait submergé par tant d'informations.
    Dead reconing envoie le point de départ, le vecteur de déplacement et la vitesse (à moins que celle-ci ne soit constante, auquel cas aucun intérêt de l'envoyer). Lorsque le joueur change de trajectoire ou qu'il s'arrête, il envoie sa nouvelle position et le nouveau vecteur de déplacement (le vecteur nul pour un arrêt).

    Citation Envoyé par skeud Voir le message
    Pour précision, les déplacements ne sont pas forcément hyper important, étant donnée qu'ils n'influe pas sur le gameplay mais seulement sur l'affichage des joueurs sur une map.
    Donc il est important : le joueur ne doit pas pouvoir contrôler ses mouvements (ou voir celui des autres si ceux-ci ne lui sont normallement pas visible) au delà de ce que peut lui permettre le serveur.

    Citation Envoyé par skeud Voir le message
    Mon jeu étant découpé en plusieurs map, chaque map fesant 10/10 cases. je pensais que lorsqu'un joueur veut passer de la case 2/2 à la case 4/4, le client envoit seulement l'information: je bouge à la case 4/4, le serveur sait donc que dans 2seconde, mon client sera à la case 4/4 (si on prend comme unité de mouvement, 1 case / seconde). Ensuite c'est au client de calculer le mouvement pour que le déplacement soit fluide à l'écran (pour éviter que mon joueur "saute" d'une case à une autre).

    Lorsque je joue à des jeu de ce type, il est fréquent que mon personnage commence à se déplacer puis corrige sa trajectoire en fonction des informations du serveur, en utilisant le Dead reckoning. Qu'en penses-tu?
    C'est du dead reckoning : point de départ (2,2) + vecteur de déplacement + vitesse (vers 4,4 dans 2 secondes).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Super, merci, c'est exactement le genre de réponse que je voulais. J'ai essayé d'implémenter ce type de processus, et effectivement, ça fonctionne bien , mes benchmark passent au vert .

    Donc la conclusion: le serveur gère le déplacement, en envoyant une coordonnée de départ, une direction (la vitesse est constente). j'ai rajouté aussi les coordonnée d'arrivé pour éviter que mon bonhomme continues si il ne reçoit rien de la part du serveur.
    De cette manière j'envois le strict minimum et mon serveur reste maitre.

    Dernière question: le path finding.
    J'hésite à l'implémenter coté client et que le serveur vérifie juste que le parcour soit correct. comme ça mon serveur n'a pas besoin de faire de calcul pour trouver le plus court chemin, il a juste à vérifier que le chemin demandé par le client est correct.

    Bonne ou mauvaise solution?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par skeud Voir le message
    Super, merci, c'est exactement le genre de réponse que je voulais. J'ai essayé d'implémenter ce type de processus, et effectivement, ça fonctionne bien , mes benchmark passent au vert .

    Donc la conclusion: le serveur gère le déplacement, en envoyant une coordonnée de départ, une direction (la vitesse est constente). j'ai rajouté aussi les coordonnée d'arrivé pour éviter que mon bonhomme continues si il ne reçoit rien de la part du serveur.
    De cette manière j'envois le strict minimum et mon serveur reste maitre.
    J'avais mal compris là où tu voulais en venir. Tu connais la position d'arrivée dès le début de trajet - c'est très bien comme ça.

    Citation Envoyé par skeud Voir le message
    Dernière question: le path finding.
    J'hésite à l'implémenter coté client et que le serveur vérifie juste que le parcour soit correct. comme ça mon serveur n'a pas besoin de faire de calcul pour trouver le plus court chemin, il a juste à vérifier que le chemin demandé par le client est correct.

    Bonne ou mauvaise solution?
    Suffisante, je dirais. Il y a peu de chance que ça pose problème (le trajet étant validé par le serveur). Au contraire, ça peut donner des infos au serveur pour affiner le dead reckoning sans pour autant le surcharger en calcul.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Ok merci pour tes conseils.Je passe le sujet en résolu
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par skeud Voir le message
    Dernière question: le path finding.
    J'hésite à l'implémenter coté client et que le serveur vérifie juste que le parcour soit correct. comme ça mon serveur n'a pas besoin de faire de calcul pour trouver le plus court chemin, il a juste à vérifier que le chemin demandé par le client est correct.

    Bonne ou mauvaise solution?
    salut pour info j'ai fait un RTS ( que j'ai distribué en freeware )et totalement terminé
    J'en ai fait une version multijoueur poste-à-poste et j'ai même joué avec un collègue
    Je te déconseille de placer le pathfinding côté serveur...c'est une logique qui doit rester côté client
    Si tu veux faire un jeu multijoueur,le plus simple c'est que tous les traitements se fassent côté client et que le serveur redirige les actions
    Par exemple si un joueur tire sur un autre, il suffit d'envoyer au message un message du genre "JOUEUR_NUM_5_TIR_30_30" avec les coordonnées de la cible du tir.
    Le serveur va recevoir ce message et le renvoyer aux autres joueurs et à chaque client de mettre à jour
    Il en va de même pour les déplacements et tu peux envoyer un message qui indique que ton joueur numéro 5 s'est déplacé..
    parce que pour synchroniser tout cela c'est pointu

  9. #9
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Si je comprend bien ton point de vue, c'est le client qui décide si il touche ou non son adversaire, un peu risqué niveau sécu non?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  10. #10
    Membre régulier
    Homme Profil pro
    Architecte serveur
    Inscrit en
    Septembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte serveur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 64
    Points : 107
    Points
    107
    Par défaut
    Ce forum étant peu vivant, je réponds quand même aux sujets antiques.

    Techniquement, la solution de Mat ne marche pas. Les actions peuvent être précalculées sur le client (pour des raisons de fluidité, on évite d'attendre une réponse serveur avant de déplacer le personnage, par exemple), mais elles doivent toutes être recalculées côté serveur. Et ce pour plusieurs raisons :
    - Eviter de tricher, comme le signale Skeud.
    - Eviter de planter le serveur / client. Si les calculs sont faits côtés clients et pas vérifiés côté serveur, il suffit d'envoyer au serveur une information erronées, et on crashe tous les clients de nos adversaires.
    - Juste parce que ça marche pas. Si vous prenez un objet sur le sol, et qu'un adversaire fait de même, il faut bien qu'il y ait une entité qui décide qui prend l'objet. Ca ne peut pas être les clients, vu qu'ils sont soumis au ping, et pourraient donc décider tous les deux que leur joueur a pris l'objet. Donc il faut que ce soit le serveur.

    Par contre, je rejoins Mat sur le pathfinder. Mieux vaut le laisser côté client, et n'envoyer au serveur que des updates de position. On laisse sur le serveur les actions qui soient demandent une validation, soient demandent de posséder des connaissances que les clients n'ont pas (unités dans le brouillard de guerre, par exemple).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Serveur/Client] ObjectInputStream -> Lire des données envoyés
    Par moithibault dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 13/06/2011, 17h15
  2. [ServerSocket]Problème communication client-serveur udp sur linux
    Par gdecrouez dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/09/2006, 14h59
  3. Problème de communication client/serveur
    Par alex6891 dans le forum Développement
    Réponses: 10
    Dernier message: 09/03/2006, 13h12
  4. [Architecture] communication client/serveur client/client
    Par daed dans le forum Général Java
    Réponses: 4
    Dernier message: 28/01/2006, 23h23
  5. Réponses: 6
    Dernier message: 04/05/2005, 09h58

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