Gestion d'une file de construction

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir à tous,

Pour mon projet Galaxia Online, je vais devoir gérer les files d'attentes de construction. Pour mettre un peu dans le contexte, un joueur peut construire un objet (batiment/vaisseau spatial), sur un certain système. Chaque système possède une valeur appelée Production, et chaque objet possède un coût en construction.

Par exemple, sur mon système nommé "Terminus", j'ai une valeur de production de 6, et je veux construire une amélioration qui coûte 40 de production. Attention, la production n'est pas stockable : c'est en fait une valeur de vitesse. Avoir 6 en production, ça signifie que je, par exemple, je construis à la vitesse de 6 production/minute. Ainsi, il me faudra 6mn40 secondes pour produire cette amélioration.

Voilà pour l'exemple, venons-en à ma question.

À chaque construcion, un objet nommé "Construction" est créé. Il contient l'objet en cours de création, l'heure de début et l'heure de fin (calculée à partir de la valeur de la construction).

Question : Comment faire pour faire en sorte qu'au moment où la date actuelle atteint la date de fin de construction, que l'amélioration soit effectivement construite ? (Ce qui correspond à une insertion dans la base de données).

En effet, ça ressemble à de la programmation événementielle, mais basée sur la base de données, donc ça me paraît compliqué :/

J'ai trouvé deux workarounds :

  • Quand le joueur est connecté, à chaque fois qu'il effectue une requête, j'utilise un hook de Symfony2 qui exécutera la fonction de mise à jour.
  • Quand le joueur est déconnecté, j'ai un cron qui est appelé toutes les minutes (valeur à définir, en fonction de la charge que ça a sur le serveur), et qui met à jour les constructions terminées.

Mais comme je le dis, ce ne sont que des workarounds, qui fonctionneront relativement bien (et encore, tout dépend de la charge que ça aura sur le serveur).

Est-ce que quelqu'un aurait une idée de comment gérer ça de façon propre, et/ou d'améliorer la façon dont j'envisage les choses ? C'est un système qui existe dans à peu près tous les jeux en ligne, donc vous savez peut-être comment c'est géré.

Merci d'avance de votre aide ;)

Édité par Coyote

+0 -0

Cette réponse a aidé l'auteur du sujet

Ça ressemble fichtrement à une eventloop ce que tu décris la.

T'as regardé s'il n'existe pas une lib PHP qui permette de faire ça ?

J'suis tombé la-dessus en cherchant rapidement, ça a l'air de faire le café :)

Édité par Javier

Happiness is a warm puppy

+0 -0

Cette réponse a aidé l'auteur du sujet

Le cron peut être une solution, mais il faut s'en méfier aussi, ça peut rapidement être très gourmand, surtout si c'est toutes les minutes. Pour 100 joueurs ça va sans doute le faire, mais pour 10000 beaucoup moins.

Je pense que la plupart des jeux en ligne de stratégie/gestion type O-Game calculent ce genre de chose de manière paresseuse. En tout cas si j'avais à programmer ce genre de jeu c'est comme ça que je ferais.

En clair, aucune modification n'est faite à la base de données tant que ce n'est pas nécessaire; autrement dit tant que le joueur ne se reconnecte pas ou qu'aucun autre joueur n'a d'interaction avec lui.

Du coup le principe est assez simple, tu stockes une file d'évènements en base, et la première chose à faire quand le joueur se connecte, c'est de dérouler la file des évènements qui le concernnent jusqu'au moment présent.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+1 -0
Auteur du sujet

Merci à tous les deux de vos réponses (et désolé du retard, j'ai eu un emploi du temps un peu perturbé).

Javier effectivement ça ressemble à ça, je sais que ça s'implémente en PHP. Le souci c'est que il y aurait beaucoup d'appels à la base de données à chaque cycle, et en les multipliant par le nombre de joueurs, ça mettrait à genoux mon serveur (je pense).

QuentinC la solution que tu proposes est également celle que je retrouve sur des forums dédiés aux jeux Web. Il suffit effectivement de "simuler" le temps réel en ne mettant à jour la queue d'événements uniquement lorsque c'est nécessaire de le faire.

Je vais donc partir sur cette solution-là, merci beaucoup à tous les deux pour votre aide ;)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte