JeuWeb - Crée ton jeu par navigateur
Tour par tour, sans "coupure serveur" - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Tour par tour, sans "coupure serveur" (/showthread.php?tid=6676)



Tour par tour, sans "coupure serveur" - Thêta Tau Tau - 26-02-2013

Salut,

J'ai eu une nouvelle idée de jeu il y a quelques jour, je suis pas encore décidé si je lui donne suite (déjà 2 autres idées en attente, et un autre projet à finir). Mais bon pour l'instant je suis en phase de réflexion, et j'ai quelques petites question techniques.

Le contexte, en simplifiant :
- Le jeu se déroule sur une carte à cases hexagonales.
- Chaque joueur dispose d'unités "customisées" (différentes de celles des autres joueurs).
- Chaque case peut contenir des unités de plusieurs joueurs en même temps.
- Ces unités combattent, sont produites et se déplacent vers d'autres cases "automatiquement" à chaque tour (en fonction des ordres que le joueur a donné).
- Les tours sont courts (c'est pas encore fixé mais ça sera moins d'une heure, voir seulement quelques minutes si les performances suivent). Bien sur pour cette durée on demande pas au joueur de se connecter à chaque tour, il donne des ordres qui sont suivis à chaque tour jusqu'à ce qui les change.

Par exemple :
-Il y a 20 unités du joueur A sur une case donnée (et X du joueur 2, Y du joueur 3 etc.).
-Elles combattent et 7 meurent (je détaillerais pas l'algo derrière ici, sachez juste qu'il nécessite de récupérer les stats de l'unité dans la bdd) => 13 unités
-3 sont produites => 16 unités
-Le joueur a donné l'ordre aux unités de cette case d'aller au Nord, 6 y vont => 10 unités
-3 arrivent du sud et 5 du nord-est => 18
-On recommence au tour suivant.


C'est le changement de tour qui me pose problème, la méthode bourrine consisterais à lancer un script à chaque changement de tour, cependant le script prendra du temps (compter quelques milliers à quelques dizaines de millier de cases, un algo de combat pas forcément très gourmand en ressources mais répété autant de fois que de cases, et la nécessité de charger toutes les infos de la base de donnée : nombre d'unité par cases, statistiques des unités, ordres de déplacement...).
Du coup avec cette méthode bourrine, le temps que le script tourne le serveur sera indisponible. Seulement, avec des tours qui se veulent court, il n'y a pas possibilité de faire le changement à 4h du mat et de déconnecter tous les joueurs présents.

Mon idée pour contourner le problème serait de calculer l'état du tour N+1 pendant le tour N, et non d'attendre la fin du tour. Ainsi on aurais deux fois l'état du serveur dans la base de donnée, une fois l'état actuel, et une fois l'état au tour suivant. Et au changement de tour il n'y a qu'à switcher d'un état à l'autre. En gros ça se déroulerais comme ça :
-Début du tour N, les joueurs voient "l'état du serveur à t=N."
-On calcule les résultats des combats/production qu'il va y avoir lors de la transition tour N=>tour N+1, on écrit dans la base de donnée "l'état du serveur à t=N+1."
-Si un joueur change un ordre (de déplacement) d'une case déjà calculée, on met à jour "l'état du serveur à t=N+1." en conséquence.
-Le tour N se termine, lorsque les visiteurs rechargeront la page ils verront "l'état du serveur à t=N+1."

Voilà où en est ma réflexion actuellement. Mes questions :
-Voyez vous une meilleure manière de faire?
-Auriez vous des conseils sur les technologies à utiliser (ou ressources/tutos qui traitent un problème similaire)? Par exemple, comment éviter de saturer la Bdd? Comment "lisser" et optimiser l'utilisation des ressources serveurs de manière à éviter des lags côté client (en lançant plusieurs processus? en mettant des taches en attente? ce genre de choses...)? J'avoue avoir de très vagues idées de ce qu'il est possible de faire, mais vraiment vagues.


RE: Tour par tour, sans "coupure serveur" - Sephi-Chan - 26-02-2013

Je ne comprends pas en quoi l'exécution de calculs lourds rendraient ton serveur inaccessible.

Tu lances la résolution à intervalle régulier en arrière plan (via un système de scheduling/queueing) ou un Cron et tout se passera bien.

La seule chose que tu dois faire, c'est de ne pas venir polluer la résolution en cours par de nouveaux ordres. La solution est simple : les ordres sont associés à un tour de jeu : en début de traitement automatique on incrémente le tour courant, ainsi tous les ordres passés à partir de cet instant seront marqués comme appartenant au tour suivant.

Si ton jeu est découpé en parties, tu peux même résoudre en parallèle plusieurs parties.

Après, pour la durée d'exécution, le mieux est de faire des tests : on ne peut pas prévoir comme ça.


RE: Tour par tour, sans "coupure serveur" - Thêta Tau Tau - 26-02-2013

Merci pour tes réponses.

(26-02-2013, 09:14 PM)Sephi-Chan a écrit : La seule chose que tu dois faire, c'est de ne pas venir polluer la résolution en cours par de nouveaux ordres. La solution est simple : les ordres sont associés à un tour de jeu : en début de traitement automatique on incrémente le tour courant, ainsi tous les ordres passés à partir de cet instant seront marqués comme appartenant au tour suivant.
Oui, ça je l'ai bien compris, c'est plus ou moins ce que j'ai décrit.

(26-02-2013, 09:14 PM)Sephi-Chan a écrit : Après, pour la durée d'exécution, le mieux est de faire des tests : on ne peut pas prévoir comme ça.
C'est vrai que le problème se posera peut être pas, et s'il se pose, j'aurais surement plus de précisions à apporter. J'ai que peu de connaissances sur le fonctionnement des bdd et des OS, du coup je m’inquiète peut être pour rien. Ce topic est surement prématuré, je le rouvrirait quand j'aurais des questions plus précises.