Bonjour,
Tout d'abord désolé si je ne poste pas dans la bonne section, ma question est liée à la structure de communication client serveur pour un jeu vidéo mais n'est pas un problème de code, juste de concept, je ne sais donc pas si je n'aurais pas mieux du poster dans la section réseau.
J'aimerais avoir votre avis :
Alors, l'idée est simple et pas originale pour 2 sous, écrire un serveur pour une application massivement multi-users en 2D. Users oui, car ce n'est pas vraiment un jeu, plus une application où l'on pourrait se déplacer et voir les autres utilisateurs connectés marcher à côté de nous (+ chat, + gestion de pas mal de trucs niveau donnée), en gros, je pense l'appli comme un jeu mais ça n'en est pas un
Ce que j'ai pour l'instant :
Quand je lance le serveur celui-ci lance un thread qui servira a servir les utilisateurs connectés (thread "service"), le premier thread lui écoute et accepte les connexions entrantes. Une fois un utilisateur connecté il est ajouté à un vecteur et un nouveau thread est lancé, qui contient le socket, pour recevoir les infos du client (touche enfoncée, ...) et calculer sa position.
De là j'ai quelques questions, j'ai pas mal pu me renseigner sur des serveurs déjà existant mais je n'ai pas toujours eu de réponse sur la façon précise dont ils faisaient les choses.
Je gère le mouvement de la façon suivante :
Le client envoi au serveur l'appuie sur une touche (touche UP enfoncée, touche UP relachée, ...) et de là le serveur (le thread client) calcule le déplacement en fonction du temps resté appuyé. A intervalle régulier le serveur (le thread de "service") interroge tous les threads clients pour connaitre leur position et envoi les données aux clients.
Pendant ce temps le client calcule lui aussi le déplacement (best quess) et corrige en fonction des données une fois reçues.
Déjà, est ce une bonne façon de faire? J'ai pu voir que certains jeux envoyaient des données au serveur à chaque frame quasiment, puis écoutaient immédiatement la réponse du serveur pour faire le rendu. Ici je n'envoie au serveur que des changements d'états et j'actualise le client à intervalle régulier. Il faut savoir qu'il ne s'agit justement pas d'un jeu et des légères desynchros sont tout a fait acceptables.
En suite, il faudrait que chaque client ne reçoive les coordonnées que des joueurs à proximité, et je ne sais pas trop comment faire, j'aimerais autant que possible éviter de devoir parcourir le vecteur entier de client alors qu'il n'y en aurait que quelques un de visible au final. J'ai tout de suite pensé aux quadtree, en définissant dès le début l'arbre, et avec chaque thread qui placerait l'utilisateur automatiquement là où il faut dans l'arbre, mais malheureusement cela reviendrait a beaucoup de manipulations de pointeurs au travers des threads et je ne sais donc pas si ça serait idéal (un thread liste un noeud pendant qu'un autre thread vient s'ajouter, ou s'enlève). J'avais aussi pensé à remplir l'arbre à chaque intervalle dans le thread de service et après a simplement dire aux threads client de ne n'envoyer au client que la partie qui les concerne. Qu'en pensez vous?
Au passage, j'ai toujours une zone d'ombre sur l'utilisation des quadtree, tant qu'un utilisateur est dans une zone on lui envoi les coordonnées de tous les joueurs dans cette même zone, mais dès qu'il arrive près d'une autre zone, que se passe t'il? il recoit les données qu'une fois entré dedans? :/ bien sur que non, il faut donc quasiement à chaque fois envoyer les positions de au moins 1 et au max 4 noeuds? P-e même que les quadtree ne sont pas du tout idéal pour cette utilisation, si vous avez des algo ou des conseils sur ça je suis preneur. Merci.
Je m'inquiète aussi, si il y a trop d'utilisateurs connectés (la cible de l'application concerne plus de 26000 personnes) n'y a t'il pas un risque de récupérer des données qui ne concerne pas le même temps?
A un temps T tout le monde est à une position X, mais le temps de lire toutes les coordonnées pour les envoyer aux clients, n'y a t'il pas un risque de l'utilisateur 0 soit en fait à une nouvelle position? l'instant T étant dépassé avec le temps du calcul..
Merci, encore désolé si je ne poste pas au bon endroit
Partager