ProjetM1MPRI2013 / central

Repo principal
6 stars 0 forks source link

Schema global scénario/simulation #7

Open mheinric opened 10 years ago

mheinric commented 10 years ago

Bon, c'est juste concernant la façon dont s'organise le code globalement, entre chaque partie. On a rien noté à ce sujet, et je pense que c'est important de se décider rapidement dessus parce que certains choix en dépendent. Donc globalement ce qu'on peut faire c'est quelque chose de plutôt linéaire, avec une boucle d'update de la forme (pour le coté serveur):

L'autre solution étant de faire deux threads séparés. Un thread sur le scénario, et un sur la simulation. Le problème majeur de cela étant que ça nécessite que toute la structure de donnée de l'état local soit accessible et modifiable de façon concurrente (aucun des conteneurs fournis dans la librairie standard n'est 'thread safe'). De ce que j'ai regardé, l'utilisation de structures parallèles (mutex, type atomique de la librairie standard, ou encore un truc de la librairie boost) donnent des temps d'exécution environ 10-20 fois plus important, ça peut être problématique si il y a des besoins massifs d'accéder à l'état local. Sans compter le fait qu'on est pas certain que l'état local soit cohérent si un pas de simulation est en cours.

Et enfin (promis j'arrête), du côté client, il faut peut être aussi caser dans la boucle un bout de calcul du module graphisme pour mettre à jour la fenêtre. Qu'est ce qu'en pense les personnes concernées?

Bref, si vous avez des suggestions.... (désolé d'en avoir mis 3 tonnes)

akoutsos commented 10 years ago

Moi et Papy étions plutôt pour un un seul thread scénario/simulation. La gestion des accès concurrent est trop chiante et lente. Sinon après je pensais que la simu ne reçoit rien du réseau (toutes les actions passe par le scénario avant). Après je pensais à une boucle du type:

Ensuite pour ce qui est de la boucle en temps constant, je n'en vois pas l’intérêt. Le serveur doit juste travailler le plus vite possible, il n'a aucune contrainte de FPS ou quoi que ce soit.

Le 14/11/2013 17:09, mheinric a écrit :

Bon, c'est juste concernant la façon dont s'organise le code globalement, entre chaque partie. On a rien noté à ce sujet, et je pense que c'est important de se décider rapidement dessus parce que certains choix en dépendent. Donc globalement ce qu'on peut faire c'est quelque chose de plutôt linéaire, avec une boucle d'update de la forme (pour le coté serveur):

  • scénario : récupérer les évenements générés par la simulation
  • traiter ces évênements, et en générer des nouveaux pour la simulation
  • simulation : récupérer les évênements reçus (réseau + scénario)
  • les traiter
  • appliquer toutes les règles d'évolution (mouvements des personnages, évolution des paramètres globaux, peur ...)
  • on recommence au début, en attendant éventuellement un peu pour avoir une boucle de temps constant

L'autre solution étant de faire deux threads séparés. Un thread sur le scénario, et un sur la simulation. Le problème majeur de cela étant que ça nécessite que toute la structure de donnée de l'état local soit accessible et modifiable de façon concurrente (aucun des conteneurs fournis dans la librairie standard n'est 'thread safe'). De ce que j'ai regardé, l'utilisation de structures parallèles (mutex, type atomique de la librairie standard, ou encore un truc de la librairie boost) donnent des temps d'exécution environ 10-20 fois plus important, ça peut être problématique si il y a des besoins massifs d'accéder à l'état local. Sans compter le fait qu'on est pas certain que l'état local soit cohérent si un pas de simulation est en cours.

Et enfin (promis j'arrête), du côté client, il faut peut être aussi caser dans la boucle un bout de calcul du module graphisme pour mettre à jour la fenêtre. Qu'est ce qu'en pense les personnes concernées?

Bref, si vous avez des suggestions.... (désolé d'en avoir mis 3 tonnes)

— Reply to this email directly or view it on GitHub https://github.com/ProjetM1MPRI2013/central/issues/7.

adhusson commented 10 years ago

Pareil que polimegalo, les événements simulation -> scénario ou scénario -> simulation sont poussés dans deux files.

Pour préciser

* si côté client le scénario envoie ses événements au réseau, que fait le scénario côté serveur avant de les donner à la simu ?

mheinric commented 10 years ago

Ok, je pensais plutot que les evenements viendrait de la partie simulation, mais ça change pas grand chose en fait. Donc du coté client, le scénario se contente juste de transmettre les évenements au réseau? Sinon je suis pas tout à fait d'accord sur le fait que le serveur n'ait aucune contrainte de FPS. Vu que les clients risquent d'avoir des calculs de rendu graphique en plus dans leur boucle, ça peut éventuellement prendre plus de temps chez eux (meme s'ils ont moins de NPC à simuler). Et ça sert à rien de simuler plus de pas que tous les clients... ouais, en fait faut voir les détails, mais sur le principe, je suis d'accord avec le serveur qui simule à fond. Sinon je suppose que côté serveur, le scénario ne transmet pas en brut les évênements à la simu. Par exemple, si le scénario génère un évênement du genre il y a une éruption volcanique qui détruit la moitié de la ville (je dis ça au pif), elle devra générer un ensemble d'évenements à la simulation du type, détruit moi ça ça et ça. La simulation gère des évenements plus bas niveau. (Je me trompe?)

akoutsos commented 10 years ago

yep on est d'accord, la simulation reçoit les données coté client. Après chez le client on avait dis que le scénario envoyai les actions à la simu qui les passent après au réseau. De cette façon la simu coté serveur peut interpoler l'évolution du monde avant que le serveur est répondu (m'enfin dans un premier temps on ne fais pas ça, on s'en occupera peut-être après je dirai). Coté serveur la simulation n'a rien à faire avec les actions des joueurs, c'est le scénario qui applique les actions. Et oui c'est ça le scénario décompose une actions en "actions de bases" chez la simulation.

Le 14/11/2013 17:53, pangel a écrit :

Pareil que polimegalo, les événements simulation -> scénario ou scénario -> simulation sont poussés dans deux files.

Pour préciser

  • côté serveur c'est le scénario qui reçoit les événements réseau et les transmet à la simu, *
  • mais côté client c'est bien la simu qui rçeoit le nouvel état du monde et transmet événement au scénario si besoin ?
  • si côté client le scénario envoie ses événements au réseau, que fait le scénario côté serveur avant de les donner à la simu ?

— Reply to this email directly or view it on GitHub https://github.com/ProjetM1MPRI2013/central/issues/7#issuecomment-28500780.

adhusson commented 10 years ago

mheinrich: je crois (polimegalo dis moi si c'est ça) que le scénario dirait plutôt "il y a une éruption volcanique ici" à la simulation. En pratique il lui passera un objet dont la méthode run() a un accès complet à la simulation, mais dans l'idée :

polimegalo: Par exemple si le scénario client envoie "joueur tue &npc" au réseau, le scénario serveur reçoit ça, qu'est-ce qu'il fait ?

akoutsos commented 10 years ago

bah pour moi c'est ça, rien de plus. On vérifie que l'action est possible et on fait l'action. C'est tout.

akoutsos commented 10 years ago

Il me semble que c'est réglé. Tu clos ?