JeuWeb - Crée ton jeu par navigateur
[Réglé] [Inventaire] Optimisation - 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 : [Réglé] [Inventaire] Optimisation (/showthread.php?tid=1088)



[Réglé] [Inventaire] Optimisation - nemesis_elite - 19-04-2007

Bonjour bonjour,

Voilà, j'ai commencé la mise en "code" d'un inventaire.
Mon code marche, mias je le trouve un peu lourd.
Voici ce que ça donne :
[Image: inventaire.JPG]

C'est assez basique je sais ^^

Voici mon code

Code PHP :
<?php 
/************** Initialisation des var *****************/
$idPerso = 1; // id du perso
$case = 0; // numero des cases du tableau
$ligne = 0; // numero de la ligne du tableau ( pour la boucle)
$obj = array(); // Array qui contiendra les infos des objets

/**************** Début du code *********************/

$req = mysql_query('SELECT i.id_objet AS id_objet, o.nom AS nom_objet, o.image AS image_objet
FROM inventaire i
JOIN objets o ON i.id_objet = o.id
WHERE i.id_perso = '
.$idPerso);

$nbObjet = mysql_num_rows($req); // On compte combien le perso a d'objet

while($res = mysql_fetch_array($req)) // On met toutes les infos des objets dans un tableau bi-dimensionnel
{
$obj[] = array($res['id_objet'],$res['nom_objet'],$res['image_objet']);
}

echo
'Votre sac :<br /><br /><table border=1>'; // On ouvre la table

while($ligne < 5) // Lignes
{
$i = 0; // On met le numero des cases à 0

echo '<tr>'; // On ouvre une ligne

while($i < 4) // Cases
{
echo
'<td width="24" height="24">'; // On ouvre une case
if($case < $nbObjet){ // on verifie si
echo '<img src="'.$obj[$case][2].'" />';
}else{
// sinon on met une image vide ^^
echo '<img src="images/vide.png" />';
}
echo
'</td>'; // On referme la case

// On incrémente
$i++;
$case++;

}
echo
'</tr>'; // On ferme la ligne
$ligne++; // On incrémente
}
echo
'</table>'; // On ferme la table

Auriez-vous des idées pour alléger mon code ?
Je pense surtout aux stockage des infos des objets, dans un tableau bi-dimensionnel.

Merci à vous


RE: [Inventaire] Optimisation - Dradge - 19-04-2007

Code PHP :
<?php
while($res = mysql_fetch_array($req)) // On met toute les infos des objets dans un tableau bi-dimensionnel
{
$obj[] = array($res['id_objet'],$res['nom_objet'],$res['image_objet']);
}
?>

Allège ton script en ne recopiant pas les objets dans un tableau temporaire. Exploite directement le résultat de MySQL.[/code]


RE: [Inventaire] Optimisation - Sephi-Chan - 19-04-2007

Le code me paraît correct.
Recopier le résultat de la requête dans ton tableau permet une manipulation plus simple.
Tu peux au besoin ajouter une dimension à ton tableau, ou bien un autre élément à la deuxième dimension.

C'est donc une solution flexible est soft.


Sephi-Chan


RE: [Inventaire] Optimisation - nemesis_elite - 19-04-2007

Merci pour vos réponse très rapide !

@ Dradge je ne vois pas trop comment...

Il n'y a donc rien à alleger ? Sephi ?


RE: [Inventaire] Optimisation - Sephi-Chan - 19-04-2007

Moi je trouve que le tableau temporaire est une bonne chose, car le traitement est bien plus simple, mais ce n'est que mon avis.
Après en effet ça peut mettre 27µs de plus que si tu ne t'en servais pas. Confusediffle:


RE: [Inventaire] Optimisation - nemesis_elite - 19-04-2007

Justement c'est a ce niveau
Code PHP :
<?php 
while($i < 4) // Cases
{
echo
'<td width="24" height="24">'; // On ouvre une case
if($case < $nbObjet){ // on verifie si
echo '<img src="'.$obj[$case][2].'" />';
}else{
// sinon on met une image vide ^^
echo '<img src="images/vide.png" />';
}
echo
'</td>'; // On referme la case

// On incrémente
$i++;
$case++;

}
Je ne voyais que cette solution


RE: [Inventaire] Optimisation - Sephi-Chan - 19-04-2007

Je viens de remarquer un truc. J'édit dans peu de temps.
Peux tu me copier ici le print_r() de ton tableau temporaire $obj, s'il te plaît ?

Je pense qu'il y a en effet une optimisation à faire, en utilisant l'opérateur modulo (%), de manière à n'avoir qu'une seule boucle.


Sephi-Chan


RE: [Inventaire] Optimisation - Dradge - 19-04-2007

27µs de plus et le double de mémoire utilisée !!!

Code PHP :
<?php 
/************** Initialisation des var *****************/
$idPerso = 1; // id du perso
$case = 0; // numero des cases du tableau
$ligne = 0; // numero de la ligne du tableau ( pour la boucle)
$obj = array(); // Array qui contiendra les infos des objets

/**************** Début du code *********************/

$req = mysql_query('SELECT i.id_objet AS id_objet, o.nom AS nom_objet, o.image AS image_objet
FROM inventaire i
JOIN objets o ON i.id_objet = o.id
WHERE i.id_perso = '
.$idPerso);

$nbObjet = mysql_num_rows($req); // On compte combien le perso a d'objet

$cpt = 0;
echo
'Votre sac :<br /><br /><table border=1>'; // On ouvre la table

//Une première boucle qui affiche les objets
while($res = mysql_fetch_array($req)) // On met toutes les infos des objets dans un tableau bi-dimensionnel
{
if(
$cpt%5==0){
echo
'<tr>';
}
echo
'<td width="24" height="24"><img src="',$res['image_objet'],'" /></td>'; // On ouvre une case
if($cpt%5==4){
echo
'</tr>';
}
$cpt++;
}

//Et une seconde pour complèter avec les cases vides
while($cpt < 20){
if(
$cpt%5==0){
echo
'<tr>';
}
echo
'<td width="24" height="24"><img src="images/vide.png" /></td>'; // On ouvre une case
if($cpt%5==4){
echo
'</tr>';
}
$cpt++;
}
echo
'</table>';

Voila ce que je propose Smile Normalement ca devrais produire le même résultat Tongue


RE: [Inventaire] Optimisation - nemesis_elite - 19-04-2007

Merci beaucoup a vous deux, en effet ce donne a peu près le même resultat.

J'aurais eu du mal a trouvé, vu que je ne connais mais pas l'opérateur modulo.
Pourrait tu juste mexpliquer cette ligne :
Code PHP :
<?php 
if($cpt%5==0){
echo
'<tr>';
}
Je vais essayer de comprendre.

Encore merci a vous


RE: [Inventaire] Optimisation - Sephi-Chan - 19-04-2007

Je propose cette solution, que je trouve plus légère d'un point de vue traitement, plus condensée aussi.
Je peux commenter le code au besoin.

Code PHP :
<?php 
$obj
= array(
array(
'id' => 1, 'nom' => 'Epée', 'image' => 'images/Armes/Epee-1.png'),
array(
'id' => 2, 'nom' => 'Casque', 'image' => 'images/Defence/Casque-1.png')
);

define('CASES', 20);
define('ELEMENTBYLINE', 4);

$tbl = '<table><caption>Inventaire</caption>';
for(
$i = 0; $i < CASES; $i++){
if(
$i%ELEMENTBYLINE == 0){ $tbl .= "\n<tr>"; }
(isset(
$obj[$i]))
?
$tbl .= "\n\t".'<td><img src="'.$obj[$i]['image'].'" alt="'.$obj[$i]['nom'].'"></td>'
: $tbl .= "\n\t".'<td><img src="images/vide.png" alt="Vide"></td>'
;
if(
$i%ELEMENTBYLINE == ELEMENTBYLINE-1){ $tbl .= "\n</tr>"; }
}
$tbl .= "\n</table>\n";

echo
$tbl;

Le HTML ici généré est proprement indenté.
Si on ne souhaite pas passer par le tableau intermediaire c'est facilement adaptable.


Sephi-Chan