Collection d'objet

Eléphant du PHP | 113 Messages

07 juin 2007, 17:18

Non rien de tout ca. Ce script c'est une page php que je lance moi même en tant que maitre du jeu. Les joueurs n'y ont jamais accès; Ce script est lance une fois par semaine (jeu en tour par tour).

Je lance ce script en local sur mon pc perso, il recup les infos de la bdd qu'il stocke dans des tableaux, le moteur de combat se met en branle et fait ce qu'il a à faire, puis je fait des updates a tout va.
Le tout en local. Je mais ensuite a jour ma base de donnée de mon site.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

07 juin 2007, 17:22

Maintenant, si un tour prend une semaine, que tu te fiches qu'un tour de jeu prenne 1 seconde ou 1 minute et que le PC en question a assez de mémoire pour exécuter le script, va vers ce qui te semble le plus facile.

ViPHP
ViPHP | 5924 Messages

07 juin 2007, 18:14

Je ne vois pas pourquoi les objets, ca prendrait beaucoup plus de place que les variables classiques...
Ils prennent plus de place parce qu'ils nécessitent plus de place... C'est aussi simple que ça. Je ne connais pas les détails techniques de façon intime, mais si tu fais un tour du côté de n'importe quel article sur les performances ou du côté des mailing list de PHP tu trouveras sûrement des infos à ce sujet.
Je viens de vérifier et c'est incompréhensible. Théoriquement ca devrait prendre la même place, là ca en prend presque 10 fois plus...

Mammouth du PHP | 505 Messages

08 juin 2007, 00:14

...et puis vu qu'on va tous mourrir un jour ça sert à rien de vivre. Si ta page est lente, raison de plus de ne pas l'alourdir encore plus.
Y a une raison particulière pour que tu répondes comme ca ou t'es toujours comme ca ?
Alors le mec, il pose une question pour des problèmes de maintenabilité de code, veux s'orienter vers de l'objet, pose la question dans le forum php5 qui soit dit en passant apporte une vraie couche objet a php et la réponse, ca devrait etre : nan php, c'ets lent, faut pas le ralentir encore plus... C'est bien....

Très bien, j'aime bien les caches, merci d'avoir utiliser ce terme. Mais comment penses-tu implémenter un "cache" sur un jeu qui stocke 1000 objets pour représenter tes adversaires ?
Bah franchement, c'est pas bien compliqué, mais vu ta facon de répondre, et vu que t'es pas concerné par le problème je répondrais a l'auteur de la question si ca l'interesse, toi, je te laisse dans tes certitudes.
Cela ne règle pas non plus les impératifs d'utilisation de la mémoire.
Quels impératifs ? il a donné des contraintes sur l'utilisation de la ram de son serveur ? Il a signalé un pb de perf ou de swap ? T'as l'air facher avec la ram, faut pas faire d'objet pour pas l'user ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

08 juin 2007, 00:41

Y a une raison particulière pour que tu répondes comme ca ou t'es toujours comme ca ?
Ça s'appelle un raisonnement par l'absurde. On ne peut pas justifier l'utilisation d'une méthode particulièrement lente par le fait que l'application est déjà lente, comme on ne peut pas dire que ça ne sert à rien de vivre puisqu'on va tous mourrir.

Ensuite, je pense qu'on met plus en péril la maintenabilité du code en forçant des concepts étrangers qu'en utilisant la POO de PHP 5. Je ne sais pas si en Java ou C++ instantier 2000 objets est une bonne pratique, mais je sais qu'en PHP ça ne l'est pas. D'autant plus que dans le jeu les 1000 vaisseaux en question ne font pas tous quelque chose, on n'a besoin de n'instancier que ceux qui vont faire quelque chose mais alors le concept d'une collection d'objet (pour le peu que j'en comprends) perd de son attrait.
Bah franchement, c'est pas bien compliqué, mais vu ta facon de répondre, et vu que t'es pas concerné par le problème je répondrais a l'auteur de la question si ca l'interesse, toi, je te laisse dans tes certitudes.
Je t'en prie, si c'est pas bien compliqué j'aimerais bien qu'on en parle dans ce sujet même. Je serais curieux d'en savoir plus sur l'approche que tu préconiserais dans ce cas. Je suis désolé que tu aies mal pris ma "façon de répondre", mais si tu veux bien expliciter ce système de cache dont tu parlais je serais heureux d'en discuter. Ce serait dommage que l'on reste chacun sur nos certitudes, non ?
Quels impératifs ?
Entre autres ceux du php.ini chez les hébergeurs mutualisés, sinon ceux de la RAM physique. Mais puisqu'il ne s'agit que d'un script de maintenance exécuté sur un ordinateur personnel c'est un point qui a moins d'importance.

ViPHP
ViPHP | 5924 Messages

08 juin 2007, 01:11

Ensuite, je pense qu'on met plus en péril la maintenabilité du code en forçant des concepts étrangers qu'en utilisant la POO de PHP 5. Je ne sais pas si en Java ou C++ instantier 2000 objets est une bonne pratique, mais je sais qu'en PHP ça ne l'est pas.
La réponse est simple, oui, dans les langages bien fait, c'est une bonne pratique puisqu'un objet n'est pas sensé prendre plus de place que les variables réelles, puisque normalement, dans un obje, on ne stocke pas les noms de variable, et évidemment pas les fonctions non plus...
D'autant plus que dans le jeu les 1000 vaisseaux en question ne font pas tous quelque chose, on n'a besoin de n'instancier que ceux qui vont faire quelque chose mais alors le concept d'une collection d'objet (pour le peu que j'en comprends) perd de son attrait.
Conceptuellement ce n'est pas un erreur. Disons que ca risque de devenir lourd s'il doit stocker toutes ses variables dans des tableaux multidimentionnels, par contre créer un objet pour stocker tous les objets, je conviens que c'est une erreur, puisque ce n'est pas du tout nécessaire...

Eléphant du PHP | 113 Messages

08 juin 2007, 14:33

Actuellement je fait tout avec des tableaux multidimensionnel. Ca marche impeccables. Le problème est donc purement de lisibilité. C'est quand même plus simple de faire:

vaisseau12.coque-=vaisseau1005.arme3.degat;

que

$vso_a[$id_vso_touche]-=$degats_armes[$id_armes];


Ensuite j'ai besoin de collection car il me faut tirer les cibles au hasard parmi une liste de vaisseaux disponible. Et pour cela la fonction rand des tableaux est trés pratique. Je m'inquiétais donc de savoir si cela serait tjs possible avec de l'objet.

Mammouth du PHP | 505 Messages

08 juin 2007, 14:47

Aucun soucis pour utiliser array_rand sur un objet de type ArrayObject, il suffit juste de caster
$collection = new ArrayObject();
// ... $collection.append(ships);
$elected = array_rand((array) $collection);

$collection[$elected].fire();

Eléphant du PHP | 113 Messages

08 juin 2007, 16:15

Tient d'ailleurs puisqu'on est à parlé de ca. Existe t'il une fonction complémentaire pour tirer une valeur dans un tableau en fonction d'un test.

Cas pratique: je veux choisir une cible sur la quelle tiré, mais tant qu'a faire il faut que la cible est + de 0 PV (on tire rarement sur les morts)

Mammouth du PHP | 505 Messages

08 juin 2007, 16:26

Pas de fonction direct mais en faisant un array_rand sur un array_filter et en définissant une fonction de callback qui fera le filtre sur la ou les propriétés que tu souhaites, y a pas de soucis

Eléphant du PHP | 113 Messages

08 juin 2007, 18:46

Grumph et en bon français sa donne quoi tout ce que tu viens de dire la ^^

Eléphant du PHP | 199 Messages

08 juin 2007, 18:53

Tu fais appel à la fonction array_filter() qui te permet elle-même d'appeler une fonction de callback (un filtre si tu préfères) sur ton tableau. Dans ta fonction de callback tu filtres les vaisseaux qui n'ont pas de points de vie. Tu obtiendras donc un tableau avec uniquement les vaisseaux attaquables. Et là tu fais ton array_rand() dessus.
Klomac - Blog Lambda

Eléphant du PHP | 113 Messages

12 juin 2007, 16:24

Ok je vois et coté perf ca donne quoi ca? Sachant que je peux filtrer X fois sur X paramètres, le tout dynamiquement (les paramètres changent)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

12 juin 2007, 18:46

titerm va pas être content mais on peut prédire sans trop se mouiller que les performances d'une boucle d'array_rand() sur un array_filter() avec un callback perso sur un ArrayObject casté en (array) vont être : pas bonnes.

D'ailleurs, où en es-tu au niveau du code ? Comment gères-tu ta "collection d'objets" ? Au niveau des perfs, ça donne quoi ?

Avec plus d'infos sur le code en question il devrait être possible de deviser des alternatives. Par exemple, le code qui filtre/trie/tire un vaisseau au hasard pourrait appartenir à la classe qui héberge tous ces objets. Plutôt que de caster un objet en array et d'utiliser array_rand() tu peux peut-être exploiter certaines propriétés de tes données. Par exemple, si tes objets sont dans un tableau indexé numériquement tu n'as pas besoin d'array_rand() pour tirer une clé au hasard puisque tu sais déjà quelles sont les clés du tableau (de 0 à n, où n est le nombre d'objets moins 1).
public function un_au_hasard()
{
    return $this->obj[mt_rand(0, count($this->obj) - 1)];
}
Dans certains cas, plutôt que d'appliquer ton filtre à tous les objets de ta collection puis en tirer un au hasard, il est plus performant de faire le contraire : en tirer un au hasard, voir si c'est une cible valide et recommencer si nécessaire. C'est une approche dite "optimiste". Ça ne marche que si tu as de bonnes probabilités de tomber sur le bon dans les premiers coups, et que les calculs pour en tirer un au hasard n'excèdent pas les calculs pour filtrer toute la collection.

Eléphant du PHP | 113 Messages

13 juin 2007, 12:14

Ben le problème c'est qu'au début du combat toutes les cibles sont vivantes, donc tu mettra peu de temps a tirer un valeur correcte.

Inversement plus le combat avance plus il y a de morts et plus le temps pour trouver une cible va exploser.