[C++ - Corba] Concept de réseau massivement multijoueur

Concept de réseau massivement multijoueur [C++ - Corba] - C++ - Programmation

Marsh Posté le 06-01-2005 à 09:31:52    

Bonjour et bonne année !
 
Je suis en train d'essayer de faire, en C++ et Corba, un environnement 3D réseau (avec chat).
J'ai un petit problème de conception et j'aimerais bien connaitre vos avis .... vous avez peut etre déjà été confronté a ce problème.
 
Problème :
Lorsque qu'un client effectue une action, il envoi la modification au serveur et tous les autres clients doivent etre prévenus.
 
Solutions pensées :
1 - Chaque client possède également une partie serveur et ainsi le serveur principal leur envoi directement les modifications
Avantage : rapidité lors de l'execution
Inconvénient : plus dur a mettre en oeuvre
 
2 - Chaque client contacte le serveur a chaque cycle de son execution et le serveur principal lui envoi les modifications s'il y en a
Avantage : plus simple a mettre en oeuvre
Inconvénient : je ne sais pas si Corba est assez rapide pour pouvoir supporter la connexion de plus de 30 clients toutes les 5-10 ms et d'envoyer les infos s'il y en a
 
 
Il faudrait que le temps maximal pour chaque accès (avec calculs) soit de 50ms pour rester dans des temps corrects.
Je vais essayer de faire des tests de rapidité en passant 2Ko de chaine de caractère (mais je me souviens plus comment on gère les ticks).
 
Que pensez vous de mon problème et que me conseillez vous ?
Je pense que la 1ere solution serait la plus efficace mais étant donné que je commence a peine le projet et que l'on a environ 6 semaines pour faire tout ca ..... j'ai peur que ce soit dur dur.
 
 
Merci beaucoup
Et désolé si je n'ai pas posté au bon endroit
 
A bientot
Damien

Reply

Marsh Posté le 06-01-2005 à 09:31:52   

Reply

Marsh Posté le 06-01-2005 à 09:39:21    

Généralement, on utilise UDP plutôt que TCP pour les envois. En faisant du broadcast sur les réseaux locaux.
Mes 2 premières questions avant de te répondre seront donc:
 
1. Est-ce que CORBA est imposé ?
2. Est-ce pour du réseau local ou pas ?
 
Pour le reste de tes questions, je te répondrai un poil plus tard.

Reply

Marsh Posté le 06-01-2005 à 11:15:35    

Ta solution 1 ca s'appelle un call-back  :) Je pense que cette solution est simple à mettre en oeuvre mais va te generer un grand nombre de messages... Si a chaque fois qu'un client fait qq chose tu doit notifier les 29 autres en plus en passant par le serveur, tu imagines le nombre de messages à envoyer... D'un autre coté les messages seront assez court, puisque tu n'enveras que l'action d'un client et pas tout son etat.
La solution 2 est plus compliqué a mettre oeuvre puisque tu devras gérer un delta sur ton serveur entre chaque appel d'un client. L'avantage est qu'il y aura moins de messages à envoyer mais ils seront peut etre plus gros.
Personnelement je pense qu'il vaux mieux que ton serveur notifie regulierement tout les clients (via des methodes transient) en leur envoyant l'état de tout les clients à un instant donné.
 
Edit: je me demande si CORBA est vraiment bien adapté à ton probleme, il faudrait plutot un middleware qui puisse te faire du multicast


Message édité par nerisson le 06-01-2005 à 11:23:45
Reply

Marsh Posté le 06-01-2005 à 15:54:24    

Merci pour vos réponses ...
 
CORBA ne m'était pas imposé et je dois pouvoir toujours en changer si il y en a un de vraiment mieux. Le problème est que le temps nous est compté et que j'aurais surement du mal a apprendre un nouveau concept si celui ci est compliqué
 
Au niveau du réseau, il faudrait quand meme que ca puisse marcher sur Internet meme si les tests seront fait en réseau local (Internet n'est donc pas indispensable mais très vivement conseillé).
 
Je pense a peut pres comme toi Nerisson c'est a dire que la méthode où le serveur principal contacte tous les clients régulièrement pour leur envoyer les MAJ est la meilleure solution. Le problème est toujours le meme : le temps ... car cette méthode me parait vraiment plus longue et plus compliquée a implémenter
 
Donc je continue mes réflexions ...
J'ai fais des tests sur un réseau local (qui n'est pas très performant) :
transfert de 40Ko + retour de 2 octets --> 16 - 30 millisecondes
transfert de 100Ko + retour de 2 octets --> 30 - 45 millisecondes
 
Ca me parait raisonnable (surtout que nous ne devrions pas utiliser plus de 2Ko par client et par cycle). Je testerai ce soir sur Internet avec 2 PC situés dans la meme ville (pour voir déjà sur une courte distance).
 
Merci beaucoup pour vos réponses.
Damien

Reply

Marsh Posté le 06-01-2005 à 16:02:10    

Euh 100 Ko par message ca me semble enorme. Il y aura quoi dans tes messages ?
 
Sinon le problème avec CORBA c'est que ton serveur va devoir envoyer le même message à tout tes clients. Si tu as peu de clients ca devrait aller, mais sinon il faudrait peut-etre penser à utiliser un autre outils

Reply

Marsh Posté le 06-01-2005 à 16:51:07    

Ne t'inquietes pas, je testais les 100Ko juste pour regarder la rapidité mais j'estime que le serveur ne devrait pas devoir a envoyer plus de 10Ko par cycle avec une dizaine de clients.
 
L'idéal serait que l'on puisse y mettre une cinquantaine de personnes mais nous ne testerons jamais (ou juste une fois pour voir) avec plus de dix personnes.
 
A quels outils pensent tu pour éviter d'envoyer le meme message a tous les clients ?
 
Merci beaucoup
Damien

Reply

Marsh Posté le 06-01-2005 à 17:43:06    

Regarde les notifications et les events de corba.

Reply

Marsh Posté le 07-01-2005 à 10:41:21    

Worldofdada a écrit :

A quels outils pensent tu pour éviter d'envoyer le meme message a tous les clients ?


 
Ben il te faut un middleware capable d'envoyer les messages en UDP ou en IP multicast. Je ne crois pas que CORBA puisse faire ca. Quelle implementation utilises-tu ?
 
Sinon, si j'ai bien compris les messages contiendront des informations du genre position dans l'espace de chaque client et eventuellement un chat entre 2 clients ?

Reply

Marsh Posté le 07-01-2005 à 19:57:12    

Exactement ... il y aurait en gros une structure stockée sur le serveur pour chaque client avec des informations comme la liste des nouvelles positions des autres clients s'ils ont bougés ainsi qu'une liste de messages.
Rien de bien gros en somme.
 
Qu'entends tu par "Quelle implémentation utilise tu ?"
Je fais un :
MonImpl MonImpl_ptr;
// Conversion en un objet servant de type Lien
Lien_var Lien_ior = MonImpl_ptr._this();
 
Mais ca m'étonnerais que ce soit ce que tu voulais savoir.
 
Merki

Reply

Marsh Posté le 08-01-2005 à 11:11:03    

Salut !
 
J'ai cherché les Evenements en Corba et ca a l'air d'etre exactement ce qu'il me faut.
Si j'ai bien compris, le serveur peut envoyer un évènement a ses clients (j'ai pas réussi a voir s'il pouvait l'envoyer a un seul client) et ainsi, meme si je ne peux pas transmettre d'infos, les clients peuvent etre au courant qu'ils doivent venir chercher une mise à jour.
Est ce bien celà le concept des évènements (je préfère en etre bien sur plutot que de me lancer là dedans si j'ai mal compris mais d'apres plusieurs sources, ca a l'air d'etre ca) ?
 
Vous n'auriez pas un exemple de code utilisant les Events en C (ou C++) ?
Car j'ai trouvé un seul exemple dans un ppt mais il était plutot complexe pour une premiere approche.
 
Je continue a chercher ....
 
Merci beaucoup

Reply

Marsh Posté le 08-01-2005 à 11:11:03   

Reply

Marsh Posté le 10-01-2005 à 09:45:08    

Je voulais savoir quel ORB tu utilises pour faire du CORBA, si c'est VisiBroker, Orbacus...

Reply

Marsh Posté le 10-01-2005 à 10:05:09    

Ah oki, désolé de pas avoir compris la question (je suis un padawan du Corba).
 
J'utilises ORBacus

Reply

Marsh Posté le 10-01-2005 à 11:58:59    

Je ne sais pas si çà peut t'aider mais tu peux peut etre jeter un coup d'oeil sur NeL, c'est une librairie open-source comprenant un moteur 3D performant, une gestion réseau a base de services communiquant en UDP (avec callbacks etc...)
 
C'est la librairie que développe Nevrax pour son jeu Ryzom, qui est un massivement multijoueurs ;) (cette lib est aussi utilisée par qq autres boites de jeux a travers le monde)
 
Il doit etre possible pour toi de ne garder qu'une architecture client-serveur assez simple en t'inspirant de la partie réseau de NeL
 
infos sur NeL:
www.nevrax.org
 
sur ryzom:
www.ryzom.fr
 
Bonne chance :)

Reply

Marsh Posté le 11-01-2005 à 12:46:27    

Je viens de regarder la doc ORBacus et ils disent qu'il faut lancer le service events (apparemment un peu de la meme manière que le service d'annuaire).
 
Ils mettent :
eventserv  [-h,--help] [-v,--version] [-i,--ior] [-t,--typed-service] [-u,--untyped-service]
 
Le problème est que je n'ai pas ce fichier dans OOC\bin\ (contrairement a nameserv qui me sert pour l'annuaire).
 
Est ce normal où est ce que j'ai loupé un truc ?
(je vais peut etre créer un nouveau post car celui là s'écarte un peu du topic initial)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed