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 :

Question de calcul sur les MMO (web)


Sujet :

Réseau et multijoueurs

  1. #1
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut Question de calcul sur les MMO (web)
    Bonjour,

    Par curiosité, je me demandais comment étais géré les calcules dans un jeux de type MMO, si par exemple chaque joueur a 5 ressources (bois, viande..etc) et que les ressources évoluent à chaque secondes et ceux pour tous les joueurs, comment est calculé tout ça ? ça me parait énorme en terme de calcule...

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    En général, les données sont calculées coté client ET coté serveur. Ainsi, le client n'a pas a demander au serveur tout le temps quel est son niveau de ressources et s'il est possible ou non de faire telle action.

    Mais le serveur peut vérifier que le client ne triche pas.

  3. #3
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Ok, mais comment ?

    c'est plutôt ça qui m'intrigue.. le serveur fait comment pour recalculer tout ça ? un shéduleur en base de données, des scripts qui fond des insert/update.. ?

    Et si des joueur prennent la main sur les donnée pendant la mise a jour ?

    Autant de question qui trotte dans ma petite tête..

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2005
    Messages : 249
    Points : 349
    Points
    349
    Par défaut
    Euh, tu parles d'un MMO web du genre en php/mysql, ou bien d'un jeu en temps réel style world of warcraft? Parce que dans le 2e cas, ça ne fonctionne pas avec une BDD et des insert/update, je pense que c'est un programme qui tourne 24/24 et qui gère lui-même directement toutes ces variables en mémoire

  5. #5
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kremvax Voir le message
    Euh, tu parles d'un MMO web du genre en php/mysql, ou bien d'un jeu en temps réel style world of warcraft? Parce que dans le 2e cas, ça ne fonctionne pas avec une BDD et des insert/update, je pense que c'est un programme qui tourne 24/24 et qui gère lui-même directement toutes ces variables en mémoire
    Oui je parle bien d'un MMO web, genre exile ou empire universe, avec une base de données pour la persistance.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Citation Envoyé par Golgotha Voir le message
    Oui je parle bien d'un MMO web, genre exile ou empire universe, avec une base de données pour la persistance.
    Ah, mais ça change tout !

    Dans ce cas, la quantité de ressource est recalculée au moment ou elle est utilisée. On va par exemple stocker combien on gagne de blob par unité de temps (donnée qu'on appelle qblob), ainsi que le résultat et la date du dernier montant calculé.

    Dès qu'on utilise des blobs, on calcule qblob*temp + précedentCalcul et on met a jour la bdd. De même si qblob est amené à être modifié.

  7. #7
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    Ah, mais ça change tout !

    Dans ce cas, la quantité de ressource est recalculée au moment ou elle est utilisée. On va par exemple stocker combien on gagne de blob par unité de temps (donnée qu'on appelle qblob), ainsi que le résultat et la date du dernier montant calculé.

    Dès qu'on utilise des blobs, on calcule qblob*temp + précedentCalcul et on met a jour la bdd. De même si qblob est amené à être modifié.
    A chaque fois que la ressource est utilisé on calcule, ça se fait du coté serveur, on actionne un trigger ?

    En gros, si la ressource est modélisé en Objet avec des get et set, a chaque fois que l'on fait un get, la fonction recalcule et renvoie ce dernier.

    Et dans le cas de voyage dans une carte de deux objet, si A se déplace vers B, quand A rencontre B, un calcule doit être éffectué (par exemple si ce sont deux vaisseau qui se batte), doit on faire le calcule de la même manière ou pas ? calcule asynchrone déclencher par une connexion par exemple.

    ça me parait compliquer a mettre en place.. comment s'assurer que j'ai bien pensé a tout les cas ou la ressource ou l'objet doit être recalculée ?

    Bon et j'ai envoyer un mail a l'équipe du site exile, mmo web donc pour
    leurs demander comment il gérais les calculs sur leurs serveurs :

    Citation Envoyé par exile

    Bonjour,

    Un scheduler exécute des fonctions à des intervalles donnés.



    donc ça ne va pas dans le sens de la discutions.. exile compte à peut près 1000 à 2000 membres, dans ce cas c'est sans doute possible, quoique ça fait beaucoup de calcul !

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    C'est pas ce que fait nainwak ou HC. Et rien ne sert de calculer des données qui ne sont pas utilisées.

    Sinon, comment être sur ? c'est simple, il faut passer par un couche d'abstraction quand ut manipule les données.

  9. #9
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    C'est pas ce que fait nainwak ou HC. Et rien ne sert de calculer des données qui ne sont pas utilisées.

    Sinon, comment être sur ? c'est simple, il faut passer par un couche d'abstraction quand ut manipule les données.
    Une couche d'abstraction ? peut tu développer ?

    Voici une précision de la team exile sur ce point :

    Citation Envoyé par exile
    Juste pour préciser en ce qui concerne les ressources, ce n'est pas calculé à chaque seconde, ce ne serait pas possible.
    On sait juste qu'à une date donnée, on a tant une certaine quantité d'une ressource et qu'il y a une certaine production (par heure, par minute, peu importe) de cette ressource. Il devient alors facile de connaitre la quantité à tout moment.
    Merci encore à eux, de bien vouloir me répondre.

    Voila qui retourne un peut la situation, les ressources sont donc bien calculer à la "vue" de celui ci.. économie en terme de calcul mais complexifie l'environnement.

    Ce modèle n'est pas valide pour des recherche par contre.. je m'explique, si je fait un recherche me permettant de passer de 1 bois par minutes par exemple à 2 bois par minutes, il faut bien que lorsque la recherche est terminer le taux de production de bois passe à 2, et impacte directement le nombre de ressource dispo.. ou faut il faire un calcul complexe au moment de la "vue" prenant en compte tout ça.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Je pense que le mieux à ce moment la est de tricher : demander a l'utilisateur de valider la fin de la recherche ou quelque chose du genre

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    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 408
    Points : 20 542
    Points
    20 542
    Par défaut
    Citation Envoyé par Golgotha Voir le message
    c'est plutôt ça qui m'intrigue.. le serveur fait comment pour recalculer tout ça ? un shéduleur en base de données, des scripts qui fond des insert/update.. ?

    Et si des joueur prennent la main sur les donnée pendant la mise a jour ?
    Dans les bases de données les MAJ sont verrouillées.
    Dans un jeu tout web je ne vois pas comment un joueur peut prendre la main...
    Dans un jeu de stratégie même tout web par exemple de simulation spatiale, je pense que c'est la technique de machine par états qui est utilisée ( pour cela je recommende des livre sur l'IA )
    Par exemple,
    - tu veux construire une maison tu donnes l'ordre de construire une maison.
    -tu veux utiliser 3 ressources en bois tu vas donner l'ordre d'utiliser 3 ressources en bois
    Après c'est une pile d'événements et l'appli serveur lit tous ces événements et agit,effectue les calculs en conséquence.
    Bref c'est une hypothèse...

    Mais est-ce que tu peux répondre avec précision :Exile j'arrive pas à retrouver le lien et Empire Universe je tombe sur un site en allemand.

    Est-ce que tu peux répondre très précisément comme le demandait Deadalnix ?
    Un jeu genre Warcraft client-serveur ou bien un jeu tout web ?

    Citation Envoyé par Golgotha Voir le message
    Oui je parle bien d'un MMO web, genre exile ou empire universe, avec une base de données pour la persistance.
    Est-ce que tu as déjà travaillé sur des projets avec des bases de données ?
    Si tu fais une mise-à-jour avec un INSERT en SQL le moteur de bdd verrouille les accès concurrentiels ( normal sinon ce serait la pagaille et il n'y aurait pas d'intégrité dans les données ).
    Mais même pour un jeu client-serveur en temps réel comme Warcraft les MAJ sont aussi verrouillées.
    Par exemple via le client si tu modifies la position de ton personnage le client crée un thread , verrouille les données et les envoie au serveur principal
    Du moins je suppose

    Citation Envoyé par Golgotha Voir le message
    Et dans le cas de voyage dans une carte de deux objet, si A se déplace vers B, quand A rencontre B, un calcule doit être éffectué (par exemple si ce sont deux vaisseau qui se batte), doit on faire le calcule de la même manière ou pas ? calcule asynchrone déclencher par une connexion par exemple.

    ça me parait compliquer a mettre en place.. comment s'assurer que j'ai bien pensé a tout les cas ou la ressource ou l'objet doit être recalculée ?
    Pour le déplacement d'un point A vers un point B c'est ce que tu veux faire pour un projet de jeu perso ?

  12. #12
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    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 408
    Points : 20 542
    Points
    20 542
    Par défaut
    regarde le petit exemple en C ; même si tu ne connais pas ce langage c'est pas trop difficile à piger.

    http://fr.wikipedia.org/wiki/Automate_%C3%A0_pile
    L'article est très théorique mais je pense que ces type de jeux fonctionnent sur ce principe.
    Je précise bien que c'est une éventuelle technique si quelqu'un en connait une différente..

  13. #13
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mat.M
    Par exemple,
    - tu veux construire une maison tu donnes l'ordre de construire une maison.
    -tu veux utiliser 3 ressources en bois tu vas donner l'ordre d'utiliser 3 ressources en bois
    Après c'est une pile d'événements et l'appli serveur lit tous ces événements et agit,effectue les calculs en conséquence.
    Bref c'est une hypothèse...
    Je ne pense pas.. une construction d'un bâtiment ou un achat enlève directement les ressources, d'après ce que j'ai pu voire.

    Citation Envoyé par Mat.M
    Mais est-ce que tu peux répondre avec précision :Exile j'arrive pas à retrouver le lien et Empire Universe je tombe sur un site en allemand.
    http://www.empireuniverse2.fr/actus.html
    http://www.exile.fr/

    Citation Envoyé par Mat.M
    Est-ce que tu peux répondre très précisément comme le demandait Deadalnix ?
    Un jeu genre Warcraft client-serveur ou bien un jeu tout web ?
    un jeux tout web, pas besoin de client, enfin un navigateur.

    Citation Envoyé par Mat.M
    Est-ce que tu as déjà travaillé sur des projets avec des bases de données ?
    Si tu fais une mise-à-jour avec un INSERT en SQL le moteur de bdd verrouille les accès concurrentiels ( normal sinon ce serait la pagaille et il n'y aurait pas d'intégrité dans les données ).
    Mais même pour un jeu client-serveur en temps réel comme Warcraft les MAJ sont aussi verrouillées.
    Par exemple via le client si tu modifies la position de ton personnage le client crée un thread , verrouille les données et les envoie au serveur principal
    Du moins je suppose
    Je voulais parler du cas d'un calcule périodique sur la base mais apparemment ce n'est pas la solution adéquat, mais si les ressources du jeux était calculé de manière périodique, j'imagine que si il y a 1000 joueur connecter, il y aurai eu une possibilité de collision entre le recalcule des ressource et par exemple une manipulation de ressource d'un joueur (achat, échange..etc) qui pouvaient poser problème.

    Citation Envoyé par Mat.M
    Pour le déplacement d'un point A vers un point B c'est ce que tu veux faire pour un projet de jeu perso ?
    j'ai un projet en tête mais rien de très concret, déjà je veux comprendre comment marche les jeux qui existe, j'ai pas très envie de refaire la roue.

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2005
    Messages : 249
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par Golgotha Voir le message
    Je voulais parler du cas d'un calcule périodique sur la base mais apparemment ce n'est pas la solution adéquat, mais si les ressources du jeux était calculé de manière périodique, j'imagine que si il y a 1000 joueur connecter, il y aurai eu une possibilité de collision entre le recalcule des ressource et par exemple une manipulation de ressource d'un joueur (achat, échange..etc) qui pouvaient poser problème.
    Je me rappelle que dans des jeux comme mountyhall (je sais même pas si ça existe encore), le serveur était indisponible 1 fois par jour pour effectuer tous les calculs. Ensuite au cours de la journée, les données ne sont modifiées que par les actions des joueurs.

    Maintenant concernant les accès concurrents à une ressource, je ne crois pas que ce soit si difficile à gérer : imaginons que deux joueurs veulent récupérer un morceau de bois par terre quasiment en même temps, c'est tout simplement le premier qui fait l'action qui le récupère, pour le deuxième joueur on affichera un message du style "Machin a été plus rapide que vous" et basta.

    De toutes façons, dans un jeu réseau il faut accepter que ce que voit le client n'est pas forcément la réalité, il peut toujours y avoir une désynchro. L'essentiel c'est que le jeu reste cohérent pour le serveur.

  15. #15
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Bonjour,

    Etant moi même créateur de plusieurs petits jeux web et m'étant pas mal intéressé sur le sujet, je peux répondre à toute tes questions.

    Il existe plusieurs méthodes, souvent couplés, afin de mettre à jour les données (ressources par exemple) :
    - ReCalculer les données à chaque raffraichissement de page et mettre à jour dans la base seulement lorsque ces dernières sont utilisées.
    - Mise en place d'un CRON (on ne va évidemment pas mettre un script qui recalcule les données toutes les minutes, ce serais trop lourd). On l'utilise généralement pour faire une MAJ générale journalière, par exemple à minuit tous les jours.

    Lors de l'achat d'un batiment par exemple, on va recalculer les ressources courante avec cette formule :
    ressources en base + temps passé entre dernier enregistrement en base de la ressource * gain en ressource par minute
    et on va mettre à jour directement en base la nouvelle donnée (formule ci dessus - cout batiment pour chaque ressource).

    Tout simple donc, pas de trigger, ni rien, juste directement une requete dans le code pour l'action achat de batiment.

    Lors de la MAJ journalière, pas mal de site de jeu passent le jeu en mode "maintenance" ce qui dure généralement quelques minutes, pas plus (on en profite pour faire aussi une sauvegarde automatique de la bdd ainsi que d'autres actions journalières).

    Le scheduler dont parle la personne d'exile doit seulement être la mise à jour des ressources côté client (et non côté serveur) donc pas de MAJ de la bdd.

  16. #16
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    raaaaa merci

    Je commence à mettre tout ça par écrit dans un cahier des charges, pas facile facile, donc ça fait du bien d'avoir du monde pour aider, je prends note de toutes vos remarques ! MERCI !

    Citation Envoyé par loka Voir le message
    Lors de l'achat d'un batiment par exemple, on va recalculer les ressources courante avec cette formule :


    et on va mettre à jour directement en base la nouvelle donnée (formule ci dessus - cout batiment pour chaque ressource).

    Tout simple donc, pas de trigger, ni rien, juste directement une requete dans le code pour l'action achat de batiment.
    Le truc est donc d'économiser au plus en calculant "a la volée" les données dans la vue si ce n'est juste que pour les afficher, sinon, si elles sont utilisée il faut persister les données en base !

    Si j'implémente ça dans un modèle MVC, ou je fait le calcule "a la volé" ? c'est le contrôleur ?

Discussions similaires

  1. Questions sur les navigateurs web
    Par Eric_M dans le forum C#
    Réponses: 3
    Dernier message: 07/06/2010, 17h54
  2. [C#] Calcul sur les dates avec des DateTimePicker
    Par alizee971 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 02/04/2005, 18h14
  3. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 11h51
  4. [LG]J'ai honte : question de cours sur les paramètres
    Par letibdesneiges dans le forum Langage
    Réponses: 14
    Dernier message: 17/01/2004, 14h57

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