Merci pour vos réponses
Je ne savais pas que le range de valeur des FLOAT était si grand
C'est vrais que ça n'est plus un problème du coup
(Pour info : BIGINT UNSIGNED : de 0 à 18,446,744,073,709,551,615 )
Par contre un gros problème des virgules flottantes c'est que ce n'est pas de l’arithmétique exacte :/
C'est à dire que un joueur qui est connecté 24h/24 et navigue de page en page toutes les secondes ne verra pas ses ressources augmenter de la même façon qu'un joueur naviguant sur la site à raison de 1 page par semaine... (Bon, d'un point de vue théorique, je vous l'accorde)
MYSQL précise quand même que le range de valeur possible ainsi que la précision, dépend du hardware !
Ce qui n'est pas le cas des entiers.
Sinon, Horace, ta solution du modulo est très séduisante ! J'aime beaucoup !
Voici comment je l'ai compris:
Dans la BDD:
ressource: Le nombre de ressources dont dispose le joueur.
seconds_ignored: Le nombre de secondes qui n'ont pas encore été comptabilisées.
lastUpdate: La date et heure de la dernière mise à jour.
Petit exemple !
La production est de 360 unités/heure. Donc de 0.1 unité par secondes.
Il faut donc 10 secondes / unité
On commence avec :
ressource: 0
seconds_ignored: 0
lastUpdate: 2011-02-06 12:00:00
Le joueur retourne sur la page après 5 secondes
On calcule
Gain = Floor( (TimeElapsed + SecondsIgnored) / SecondsByUnit )
Gain = Floor( (5+0) / 10) = 0
Modulo = (5+0) % 10 = 5
On a donc
ressource: 0
seconds_ignored: 5
lastUpdate: 2011-02-06 12:00:05
La joueur retourne sur la page après 8 secondes
Gain = Floor( (8+5) / 10) = 1
Modulo = (8+5) % 10 = 3
On a donc
ressource: 1
seconds_ignored: 3
lastUpdate: 2011-02-06 12:00:13
Ce qui est génial, c'est que si le coefficient change, ça ne pose aucun problème sur les valeurs stoquées dans la BDD.
De plus, avec cette technique, aucune seconde n'est ignorée ! Et si j'ai rien zappé, que le membre déclenche des updates toutes les secondes ou une fois par mois, il y aura aucune différence.
Petit bémol toutefois, il faut pour chaque ressources garder un champ supplémentaire dans la BDD. Celui du nombre de secondes ignorées.
J'ai bien tout compris ? Qu'en pensez vous ?
Je ne savais pas que le range de valeur des FLOAT était si grand
C'est vrais que ça n'est plus un problème du coup
(Pour info : BIGINT UNSIGNED : de 0 à 18,446,744,073,709,551,615 )
Par contre un gros problème des virgules flottantes c'est que ce n'est pas de l’arithmétique exacte :/
C'est à dire que un joueur qui est connecté 24h/24 et navigue de page en page toutes les secondes ne verra pas ses ressources augmenter de la même façon qu'un joueur naviguant sur la site à raison de 1 page par semaine... (Bon, d'un point de vue théorique, je vous l'accorde)
MYSQL précise quand même que le range de valeur possible ainsi que la précision, dépend du hardware !
Ce qui n'est pas le cas des entiers.
Sinon, Horace, ta solution du modulo est très séduisante ! J'aime beaucoup !
Voici comment je l'ai compris:
Dans la BDD:
ressource: Le nombre de ressources dont dispose le joueur.
seconds_ignored: Le nombre de secondes qui n'ont pas encore été comptabilisées.
lastUpdate: La date et heure de la dernière mise à jour.
Petit exemple !
La production est de 360 unités/heure. Donc de 0.1 unité par secondes.
Il faut donc 10 secondes / unité
On commence avec :
ressource: 0
seconds_ignored: 0
lastUpdate: 2011-02-06 12:00:00
Le joueur retourne sur la page après 5 secondes
On calcule
Gain = Floor( (TimeElapsed + SecondsIgnored) / SecondsByUnit )
Gain = Floor( (5+0) / 10) = 0
Modulo = (5+0) % 10 = 5
On a donc
ressource: 0
seconds_ignored: 5
lastUpdate: 2011-02-06 12:00:05
La joueur retourne sur la page après 8 secondes
Gain = Floor( (8+5) / 10) = 1
Modulo = (8+5) % 10 = 3
On a donc
ressource: 1
seconds_ignored: 3
lastUpdate: 2011-02-06 12:00:13
Ce qui est génial, c'est que si le coefficient change, ça ne pose aucun problème sur les valeurs stoquées dans la BDD.
De plus, avec cette technique, aucune seconde n'est ignorée ! Et si j'ai rien zappé, que le membre déclenche des updates toutes les secondes ou une fois par mois, il y aura aucune différence.
Petit bémol toutefois, il faut pour chaque ressources garder un champ supplémentaire dans la BDD. Celui du nombre de secondes ignorées.
J'ai bien tout compris ? Qu'en pensez vous ?