JeuWeb - Crée ton jeu par navigateur
Ressources (qu'en pensez-vous)? - 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 : Ressources (qu'en pensez-vous)? (/showthread.php?tid=4434)

Pages : 1 2 3


RE: Ressources (qu'en pensez-vous)? - Zamentur - 13-11-2009

(13-11-2009, 11:15 AM)Anthor a écrit :
(13-11-2009, 02:37 AM)Zamentur a écrit : Tu fait toujours une seul requête, et çà t'évite d'avoir à gérer çà dans tes sessions. Autrement dit c'est aussi performant (voir plus car moins complexe donc moins de problème de maintenance) et en plus çà te prend moins de à faire...

Alors là faudra m'expliquer en quoi une requête SQL est aussi rapide que d'accéder à un fichier de session !
Ben j'ai fait l'hypothèse que le nombre de ressource peut être mis à jour soit par des actions dépendantes du joueur soit par des actions indépendantes de ce dernier.

Or dans le cas de mise à jour indépendante du joueur (par exemple vol de ressource, gain à une loterie etc...) on est obligé de faire une demande à la base de donnée pour vérifier si le timestamp enregistré dans le fichier session est identique au timestamp enregistré dans la base de donnée. Si il est différent c'est donc qu'il y a eu mise à jour...

J'entends par mise à jour quelque chose qui vient bouleverser la production habituelle de la ressource.

%on hypothèse est basé sur cette phrase:
Citation :-les données ressources sont mises à jour (UPDATE) dans la base de donnée que quand il y a une action (action, dépense de ressources, gains de ressources etc...)
Le "etc..." signifie que tout n'est pas définis, autrement dit çà peut évoluer, et si on veux pouvoir faire quelques choses d'évolutif il faut choisir ma solution.

Maintenant, c'est vrai que dans le cas ou toutes les mise à jours des ressources ne dépendent que du joueur on peut utiliser les sessions de façon avantageuse, comme présenté plus haut.


RE: Ressources (qu'en pensez-vous)? - php_addict - 13-11-2009

(13-11-2009, 10:53 PM)Zamentur a écrit :
(13-11-2009, 11:15 AM)Anthor a écrit :
(13-11-2009, 02:37 AM)Zamentur a écrit : Tu fait toujours une seul requête, et çà t'évite d'avoir à gérer çà dans tes sessions. Autrement dit c'est aussi performant (voir plus car moins complexe donc moins de problème de maintenance) et en plus çà te prend moins de à faire...

Alors là faudra m'expliquer en quoi une requête SQL est aussi rapide que d'accéder à un fichier de session !
Ben j'ai fait l'hypothèse que le nombre de ressource peut être mis à jour soit par des actions dépendantes du joueur soit par des actions indépendantes de ce dernier.

oui c'est exactement ca

cependant je vais utiliser le systeme des sessions quand meme pour l'affichage, c'est moins lourd que de faire des UPDATE a chaque fois que le joueur change de page...tant pis si c'est un peu plus lourd à coder...


RE: Ressources (qu'en pensez-vous)? - Zamentur - 14-11-2009

T'as pas compris il n'y a pas besoin de faire des UPDATE à chaque page!
Juste un SELECT que de toute façon tu feras

Autrement dit la bonne solution même du point de vue des ressources c'est de faire ce que j'ai mis dans mon premier poste, c'est à dire un SELECT par page et pas de système de session car tu es obligé de faire le select peu importe ce qu'il se passe!

Dans le premier poste il est expliqué comment à l'aide des vues(ou d'une simple requête mais c'est moins performant en termes de maintenance) il est possible de réaliser ce SELECT.

Je vais tourner le problème autrement si tu utilises les sessions c'est donc que tu penses que tu n'auras pas besoin grâce à çà de faire une requête sur la table?

Mais comme tu viens de dire qu'il y avait des évènements comme le vol de ressources qui sont indépendant d'une action du joueur, j'ai prouvé que tu serais obligé quoiqu'il arrive de faire un SELECT.
Alors entre un SELECT et un autre SELECT + un système complexe de gestion de session qu'est ce qui est le mieux du point de vue ressource?

Si j'arrive pas à vous convaincre prochain coup je vais devoir faire un exemple précis... Pour vous prouver ce que j'avance d'une autre façon


RE: Ressources (qu'en pensez-vous)? - php_addict - 14-11-2009

ah oui ok...désolé, c'est bon maintenant ;-)

par contre je comptais faire ceci:

les ressources sur une table et les autres actions par forcement sur cette meme table...donc le SELECT se fera sur 2 table, ca pose souci?

encore merci !


RE: Ressources (qu'en pensez-vous)? - Anthor - 14-11-2009

(14-11-2009, 02:00 AM)Zamentur a écrit : T'as pas compris il n'y a pas besoin de faire des UPDATE à chaque page!
Juste un SELECT que de toute façon tu feras

Autrement dit la bonne solution même du point de vue des ressources c'est de faire ce que j'ai mis dans mon premier poste, c'est à dire un SELECT par page et pas de système de session car tu es obligé de faire le select peu importe ce qu'il se passe!

Dans le premier poste il est expliqué comment à l'aide des vues(ou d'une simple requête mais c'est moins performant en termes de maintenance) il est possible de réaliser ce SELECT.

Je vais tourner le problème autrement si tu utilises les sessions c'est donc que tu penses que tu n'auras pas besoin grâce à çà de faire une requête sur la table?

Mais comme tu viens de dire qu'il y avait des évènements comme le vol de ressources qui sont indépendant d'une action du joueur, j'ai prouvé que tu serais obligé quoiqu'il arrive de faire un SELECT.
Alors entre un SELECT et un autre SELECT + un système complexe de gestion de session qu'est ce qui est le mieux du point de vue ressource?

Si j'arrive pas à vous convaincre prochain coup je vais devoir faire un exemple précis... Pour vous prouver ce que j'avance d'une autre façon

J'suis pas convaincu Wink Je veux l'exemple !


RE: Ressources (qu'en pensez-vous)? - Zamentur - 15-11-2009

non çà ne pose pas de soucis, la bonne solution reste la même.

Pour Anthor qui réclame un exemple:
Prenons donc le cas d'un joueur 1 connecté qui se fait volé des ressources par un joueur 2. Dans cet exemple j'ai enlevé la notion de type de ressource, pour éviter de trop complexifier les requêtes, mais çà ne change rien au problème.

Donc avec la solution des sessions, à chaque page nous aurons :
Code PHP :
<?php 
//Si on a pas encore visiter de page affichant
//des ressources durant la session, on met à
//0 pour permettre la récupération des données
if (!isset($_SESSION['ressource'])) $_SESSION['ressource']['timestamp']=0;

//on test pour vérifier que les ressources n'ont
//pas été changé par un évènement indépendant
//du joueur en l'occurrence notre fameux vol
//de ressource
$req=mysql_query(sprintf("SELECT timestamp,nb_ressource,vitesse FROM `t_ressource` WHERE id_joueur=%d AND timestamp=%d",$id_joueur,$_SESSION['ressource']['timestamp']));
/*Si il y a un champs dont le timestamp est supérieur
alors les ressources ont été mise à jour par un
évènement externe(ou alors c'est la première page affichant les ressources) on doit mettre à jour les variables
sessions*/
if ($data=mysql_fetch_assoc($req)) {
$_SESSION['ressource']['nb_ressource']=$data['nb_ressource'];
$_SESSION['ressource']['timestamp']=$data['timestamp'];
$_SESSION['ressource']['vitesse']=$data['vitesse'];
}
$nb_ressource_actuel=$_SESSION['ressource']['nb_ressource']+$_SESSION['ressource']['vitesse']/3600*(time()-$_SESSION['ressource']['timestamp']);

On constate qu'on a une requête en bdd + la gestion de nos variables sessions, qui correspondent à des écritures dans des fichiers (ou en bdd si le gestionnaire de session a été modifié)

Maintenant avec ce que je propose, si on a créer la vue mysql
Code PHP :
<?php 
CREATE VIEW ressources_calculees
AS SELECT nb_ressource+vitesse/3600*(UNIX_TIMESTAMP()-timestamp) AS nb_ressource_a_jour,id,type,[...] FROM t_ressources;
Il suffit de faire dans le script:
Code PHP :
<?php 
$req
=mysql_query(sprintf("SELECT nb_ressource_a_jour FROM `ressources_calculees` WHERE id_joueur=%d",$id_joueur));
$data=mysql_festch_assoc($req);
$nb_ressource_actuel=$data['nb_ressource_a_jour'];
La requête SQL est de complexité identique à traiter que celle de la première solution puisque normalement on indique l'id joueur et le type dans les 2 cas qui forment d'après le schéma de la table une clé UNIQUE

Plus court (et encore ce serait dans un de mes codes, çà ferait une ligne uniquement), plus rapide (ben oui on utilise pas les sessions).

NB: la vue n'est pas nécessaire vis à vis du problème, mais elle permet d'améliorer l'évolutivité du jeu.

Voilà pour l'exemple, qui montre que j'ai raison, si tu penses que j'ai tord, je suis curieux de voir le code que tu met en places pour détecter le cas du vol et mettre à jour tes données...

EDIT: j'ai édité la VUE j'avais fait une petite faute (un * au lieu d'un + dans la formule...)


RE: Ressources (qu'en pensez-vous)? - php_addict - 15-11-2009

merci Zamentur

j'ai abandonné l'idée des sessions, et utilisé SELECT...je verais pour les VUES plus tard

bonne journée


RE: Ressources (qu'en pensez-vous)? - Anthor - 15-11-2009

Ça m'ennuie quand même toujours de devoir faire un select sur chaque page. Je m'efforce dans mes différents moteurs que les requêtes SQL soient au minimum possible. En général, une toutes les 2-3 pages maximum, suivant les actions et le cache.

C'est si facile de créer un flag fichier ou mémoire juste pour demander au joueur attaqué de mettre à jour ces infos. De toute façon, c'est le joueur attaquant qui enclenche le calcul des ressources du joueur attaqué, et non l'inverse, donc en soit je ne suis toujours pas convaincu par faire une requête à chaque page pour si peu.


RE: Ressources (qu'en pensez-vous)? - QuentinC - 16-11-2009

Une question à Zamenture : que fait-on dans le cas où le nombre de ressources gagnées par période de temps n'est pas constante ? JE pense en particulier aux possibles technologies qui permettent d'augmenter la production. Dans ce cas, ton truc de gérer le tout du côté SQL n'est plus si avantageux que ça, si ?


RE: Ressources (qu'en pensez-vous)? - Anthor - 16-11-2009

De mon côté lors du remplissage des caches, les events sont calculés, et donc les ressources calculées par tranche. Il faut bien penser lors du calcul, à parcourir les événements finis afin d'avoir un calcul précis.
Il se peut que l'affichage soit un peu en retard, mais cela n'implique pas de problèmes. Les bonnes valeurs sont toujours retrouvées lors d'une nouvelle action.