JeuWeb - Crée ton jeu par navigateur
Gestion d'actions datées - 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 : Gestion d'actions datées (/showthread.php?tid=6343)



Gestion d'actions datées - BillyMcFly - 22-08-2012

Salut à tous, voilà une question assez ouverte que je pose, qui va surtout relever de la "technique". Smile

Pour gérer diverses actions datées d'un joueur ("construction finissant dans 4 minutes", "mission en cours - fin à 18h", etc...), je stocke habituellement tout en DB.
Ce n'est que lorsqu'un joueur va charger une page que la construction sera effectivement terminée.

Cette solution, et je suis persuadé qu'il y a mieux, me convient à peu près.

Seulement voilà, j'ai en tête un petit projet, dans lequel une ville composée de personnages non-joueur (il y en a plusieurs milliers) évoluent. (Techniquement, il s'agit de faire quelques updates en DB assez régulièrement)
Il y aurait également des évènements qui se lanceraient, de temps à autre, permettant l'arrivée de PNJ méchants, semant le désordre sur le serveur.
Mon ancienne méthode ne colle pas : lorsqu'il est question de rafraîchir une page, le temps de chargement est affreux. (On dépasse les 45 secondes dans les meilleurs cas !)

J'aimerais beaucoup trouver une solution pour automatiser certaines actions en arrière-plan.

Or, je me retrouve confronté à un deuxième problème : comment avertit-on les navigateurs des joueurs que telle ou telle chose a évolué, s'ils n'ont pas changé de page ? Quelque chose du genre : "Hé, y'a 1000 zombies qui viennentattaquer tous les joueurs du serveur !" ... "Il n'en reste plus que 950 maintenant !"

J'ai effectué diverses recherches sur ce forum, j'ai entendu parler de "CRON" essentiellement. Cette solution ne me permettra toujours pas d'avertir les joueurs, mais je crois que pour ça je resterai sur une vieille méthode ajax, qui ne cesse d'envoyer des requêtes pour savoir s'il y a du nouveau ou non. (J'ai entendu parler de méthode alternatives, mais pas assez répandues je crois... Ou alors assez peu supportées par les navigateurs des joueurs. Je peux me tromper à ce sujet !)

Bien que je pense assez bien connaître PHP, la découverte d'un nouvel outil me donne toujours l'impression d'être au pied du mur : n'y a t-il pas d'inconvénient ? Si oui, quels sont-ils ? Existe t-il d'encore meilleures solutions ?


RE: Gestion d'actions datées - Damocorp - 22-08-2012

Fiat une recherche sur le forum en recherchant les messages concernant les tchats.
Sephi-Chan y parle souvent d'un système de Push que je n'ai pas encore eu le plaisir d'apprendre mais qui ne saurai tarder.


RE: Gestion d'actions datées - BillyMcFly - 22-08-2012

Merci Damocorp ! Me voilà lancé sur l'apprentissage du fonctionnement de Node.js

Ca semble rudement plus complexe à approcher au premier abord, il y a carrément le serveur en lui-même à coder. (Si j'ai bien compris)

Je partage mon lien, au cas où : http://nodejs.developpez.com/tutoriels/javascript/node-js-livre-debutant/#LII-A Smile

C'est assez déroutant de développer quelque chose en Javascript, et non plus seulement de l'utiliser côté client.
Des gens se sont-ils déjà servis de cette technologie ? Des retours ?


RE: Gestion d'actions datées - Sephi-Chan - 22-08-2012

Le plus important, c'est d'avoir un système de scheduling couplé à un système de queueing, qui permettra d'écrire du code genre :


$in = strtotime('+4 minutes');
$args = array('building_type_id' => $building->getId(), 'player_id' => $player->getId());
ResqueScheduler::enqueueIn($in, 'buildings', 'FinishBuildingConstruction', $args);

Et comme ça, dans 4 minutes (et quelques secondes) après le lancement de ce code, la méthode perform de ta classe FinishBuildingConstruction sera appelée avec les arguments $args, te permettant d'exécuter ce que tu veux.

Selon moi, les meilleurs candidats pour ça en PHP sont PHP Resque Scheduler et PHP Resque. Ça demande bien sûr un serveur dédié.


Après, pour envoyer des informations aux navigateurs (sans que lui n'ai à les demander), il faut effectivement une solution de Push. Ici, je conseille souvent Juggernaut mais il ne sera plus maintenu (bien qu'il fonctionne très bien). Il y a aussi Faye et des services Web (avec pallier gratuit assez conséquent) comme PubNub, c'est encore plus facile.


RE: Gestion d'actions datées - Astarion - 22-08-2012

Si tu veux te lancer sur un serveur de push fait par tes soins, voici quelques bons tutos sur Node.js et Socket.io (http://nodejs.developpez.com/tutoriels/javascript/introduction-node-js/ et http://www.atinux.fr/2011/08/28/tutoriel-socket-io-debutant/

Il faut se plonger un peu dedans, mais ce n'est pas si compliqué que ça et cela a vraiment un gros potentiel !