|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() kévin defivesÉtudiant Inscription : novembre 2010 Messages : 48 ![]() |
Bonjour,
Je dois m'occuper de la partie serveur pour un MMORPG. J'utilise la SMFL 1.6 comme API. Pour le moment, j'ai pensé le faire comme ceci : Une classe serveur qui représente mon Serveur, et ce serveur possèdera plusieurs threads qui auront chacun leur tâche propre. Le Serveur possède aussi une liste (vector) de Joueur représentant les joueurs connectés. Pour l'instant, j'ai développé le thread de connexion/authentification en utilisant les selectors de la SMFL et le protocol UDP. Dans ce thread je détecte si on m'envoi un paquet, je test les données, j'instancie un Joueur et réécoute sur le port. Grace aux selectors, si un client fait une demande d'authentification, alors il est mis en attente le temps que l'autre se termine (je pense que c'est gérable car l'instanciation ce fait assez rapidement (2 requêtes SQL, 1 ajout dans un vector et un instanciation + quelque test et un parcours de vector), qu'en pensez vous ? Maintenant, je dois m'occuper de la partie envoie de données et reception de données client/serveur mais je ne sais pas du tout par où commencer et comment m'y prendre... =x Dois-je faire 1 thread pour émission et un autre pour réception ? Dois-je rassembler les deux ? Imaginons que mon thread attend un paquet d'un client (thread d'émission donc), hop, je l'ouvre et regarde ce qu'il y a dedans, je décrypte le message et il faut ensuite que j'envoie les infos au autre clients. Mais problème !? Si un autre client envoie un paquet au serveur pendant que celui ci effectue les calculs, comment je dois faire ? Faudrait-il que je stocke les paquet reçu dans un vector et mon thread d'émission s'occupe de travailler sur ce vector s'il il contient des paquet ? Du coup, mon thread de réception servirai simplement d'écouter et ranger les paquets dans un vector et ainsi il réécouterai plus vite le port pour les futur paquet ? Mais toujours le même soucis, si je reçoit un paquet alors que le thread de reception est en train de ranger dans le vector, le paquet sera perdu ? Ou il sera mis en attente et traité tout de suite après ? Je ne sais pas si je peux utiliser encore les selectors ou les threads :/ N'hésitez pas à critiquer si vous trouvez que je dois changer des choses et faire autrement etc... Je prend toute les informations que vous me donnerais ! Merci beaucoup |
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Déjà : quel langage et quel OS ?
Pour ma part, je ferais tout le réseau en asynchrone (sous Linux, tu as par exemple epoll ; sous Windows, il y a I/O Completion ports). Dans un premier temps, tu peux faire toutes les entrées-sorties sur un seul thread. Avec l'asynchrone, tu peux déjà faire tenir pas mal de clients. Pour la communication avec le moteur de jeu, tu peux utiliser une file de messages. Sur le thread réseau, c'est simple : dès que tu reçois un message réseau, tu l'ajoutes dans la file et c'est tout, de manière à ne pas bloquer le thread. Côté moteur de jeu, j'imagine qu'il y a une boucle principale. Il suffit de récupérer les messages réseau et de les traiter dans cette boucle. Citation:
|
|
|
|
10
|
|
|
#3 |
|
Invité régulier
![]() kévin defivesÉtudiant Inscription : novembre 2010 Messages : 48 ![]() |
En C++ et le programme devra tourner sous linux (j'utilise windows pour dev' pour l'instant étant donné que j'utilise la SMFL et que c'est portable autant sur linux que windows).
Quand tu dit asynchrone, tu parles de Selectors donc ? Je n'en suis qu'au début, donc pas encore de "moteur de jeu", d'ailleurs, pourrait tu m'expliquer en profondeur ce qu'est un moteur de jeu et ce que celui ci doit faire ? Je précise que je suis un novice dans le domaine, techniquement en C++ ca va mais c'est surtout sur le concept/architecture d'un serveur MMORPG que j'ai beaucoup à apprendre... |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#5 | |
|
Invité régulier
![]() kévin defivesÉtudiant Inscription : novembre 2010 Messages : 48 ![]() |
Citation:
-------------------------- Sinon, pour ce qui est de la réception, je stock les paquets "complexe" dans une liste. Ensuite, c'est mon moteur de jeu qui travaille avec cette liste. Mais c'est ce moteur qui envoie aussi les informations ou le moteur stock lui ensuite les paquets à envoyer dans une autre liste et c'est le thread d'émission qui regarde si la liste contient des paquet à envoyer ? Schéma : Réception (thread 1) --> stockage liste 1 ---> Moteur de jeu/création paquet d'émission (thread 2) --> stockage liste 2 ---> Emission (thread 3). Est-ce une bonne façon de faire ? |
|
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
Mais tout ça est à voir avec le reste de l'équipe, je ne peux faire que de vagues hypothèses. Faire un MMORPG n'est pas simple, j'ai peur que tu manques d'expérience. Citation:
|
||
|
|
00
|
|
|
#7 | ||
|
Invité régulier
![]() kévin defivesÉtudiant Inscription : novembre 2010 Messages : 48 ![]() |
Citation:
Citation:
J'aimerais (si possible) que tu développes un peu quels serait les avantages de mettre ceci dans un thread unique. |
||
|
|
00
|
|
|
#8 | |
|
Membre éclairé
![]() Inscription : juin 2006 Messages : 331 ![]() |
Il doit avoir de nombreux topics sur le forum qui parle de ce sujet.
Mais en gros tu as un "pool de threads" côté serveur , quand le serveur reçois une requête il attribue le traitement à un thread disponible du pool . En fait le thread principal ne fait qu'attendre et réceptionner les requêtes puis déléguer à un thread du pool. Pourquoi un pool car c'est assez coûteux la création d'un thread donc il vaut mieux le libérer quand on a fini de l'utiliser et le remettre dans le pool. Et quand tu es dans le thread délégué à la requête tu peux faire les traitements que tu souhaites , par exemple vérifier le déplacement demandé , changer la position du joueur si ça semble cohérent et enfin renvoyer la réponse au client. Donc pas besoin de créer un thread pour envoyé une réponse au client ce serait inutile et redondant. C'est comme cela que sont conçu tous les serveurs. Mais bon c'est juste la base de ton serveur , pas très long à concevoir. Mais le plus dur n'est pas la , c'est qu'après tu es dans un contexte multi-taches ça veux dire gestion de verrous, de méthodes synchronisé et ça c'est l'horreur à débugger, tu seras forcement confronté à de nombreux bugs. Par exemple si tu gère pas l'atomicité de tes transactions , un exemple donné par lead de développeur chez sun qui développait un serveur de jeux "généraliste" : Citation:
Donc mon humble conseil abandonne l'idée de tout refaire de a-z car ce que tu sembles vouloir coder, et la même base quelque soit le type de jeux. Utilise plutôt un serveur de jeu pour te simplifier la tâche, par exemple reddwarf server, SmartFoxServer, Photon Socket Server ect ... @++. |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com