JeuWeb - Crée ton jeu par navigateur

Version complète : Optimiser une map
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Pages : 1 2
Bonjours, je cherche à optimiser ma map (carte) pour un rpg en php. J'utilise actuellement des while pour faire un tableau, mais c'est extremement long à charger ( entre 7 et 15 secondes suivant le serveur).

Je me demande comment je pourrais faire pour optimiser, et avoir un affichage plus rapide.

Le code:

Code :
$latmax = $infosperso['latitude'] + 3;
  $longmax = $infosperso['longitude'] + 5;
  $latmin = $infosperso['latitude'] - 3;
  $longmin = $infosperso['longitude'] - 5;

  $latitude = $latmax;

  $page .='<table>';
    
while ($latitude >= $latmin ) {

  $page .='<tr>';

$longitude = $longmin;

while ($longitude <= $longmax) {

$joueurs_sql = doquery("SELECT avatar FROM {{table}} WHERE latitude='$latitude' AND longitude='$longitude' LIMIT 1", "users");
$joueurs = mysql_fetch_array($joueurs_sql);

if(mysql_num_rows($joueurs_sql) != 0){

$page .='<td><img src="images/avatars/carte/'.$joueurs['avatar'].'.gif" alt=""></td>';
}else {
$page .='<td style="width:49px; height:49px;"></td>';
}

$longitude++;
}
$page .='</tr>';
$latitude--;
}
$page .='</table>';
Ce qui est long dans ton affichage, ce sont les requêtes répétées à la BD...

Essaie plutôt ceci:
Code PHP :
<?php
$latmax
= $infosperso['latitude'] + 3;
$longmax = $infosperso['longitude'] + 5;
$latmin = $infosperso['latitude'] - 3;
$longmin = $infosperso['longitude'] - 5;

$latitude = $latmax;

$joueurs_sql = doquery("SELECT avatar,latitude,longitude FROM {{table}} ORDER BY longitude, latitude", "users");
$joueurs = mysql_fetch_array($joueurs_sql);
$lat_BD=$joueurs['latitude'];
$lon_BD=$joueurs['longitude'];

$page .='<table>';

while (
$latitude >= $latmin ) {
$page .='<tr>';
$longitude = $longmin;
while (
$longitude <= $longmax) {
if ((
$longitude==$lon_BD) &&($latitude==$lat_BD)){
$page .='<td><img src="images/avatars/carte/'.$joueurs['avatar'].'.gif" alt=""></td>';
if (
$joueurs = mysql_fetch_array($joueurs_sql)) {
$lat_BD=$joueurs['latitude'];
$lon_BD=$joueurs['longitude'];
}
}else {
$page .='<td style="width:49px; height:49px;"></td>';
}
$longitude++;
}
$page .='</tr>';
$latitude--;
}
$page .='</table>';
?>

si ce n'est pas dans le bon ordre, inverse les deux champs du ORDER BY
Par principe, il faut éviter de mettre une requête à la BBD dans une boucle.

Il vaut mieux écrire une requête plus complexe et ensuite traiter les données récupérées.
Parfois on n'a pas le choix, perso, cela ne m'a jamais embêté de les mettre dans les boucles.
comment optimiser ce genre de choses?
( mini tutorial méthodologique)

1. détecter le problème éventuel

c'est assez simple à voir:
_ on a une requête dans une boucle
_ on a beaucoup de requetes dans une même page
_ le script est suuuuuuuuuuuper long à exécuter

2. optimiser

le truc c'est de sortir la requête de la boucle.

pour cela, il faut voir quel est le lien entre la requête hors boucle et la requête dans la boucle; à partir de là, on peut faire une jointure pour obtenir, au final, les mêmes informations en une seule requete avant la boucle. il faut tester la requete pour y inclure le bon ORDER BY.

s'il n'y a pas de requete à l'extérieur, il faut procéder autrement.
la boucle utilise une ou plusieurs variables ( comme $x et $y ou $longitude et $latitude pour une carte ) dans ce cas, il faut intégrer ces variables dans la requete, via la clause ORDER BY. par exemple, on affiche les avatars sur la carte, en triant d'abord sur la coordonnée X puis sur la coordonnée Y.

A+

Pascal
Merci d'avoir expliqué ce que je lui ai recodé Tongue
il faut documenter son code Tongue
Excusez moi j'étais absent durant la semaine, merci de votre aide, je teste ca tout de suite.
Non ca ne fonctionne pas, et c'est logique. Je vais expliquer.

En fait je faisais cette requete:

$joueurs_sql = doquery("SELECT avatar FROM {{table}} WHERE latitude='$latitude' AND longitude='$longitude' LIMIT 1", "users");

Lorsque que je joueur était situé sur une case précise, on exécutais tous les requetes avec un where (WHERE latitude='$latitude' AND longitude='$longitude')

Genre si le joueur est situé sur un longitude 1 et une latitude 2 on faisai une requete comprenant WHERE latitude=2 AND longitude=1

or la c'est un order, et on a plus les variable $longitude et $latitude dans la requete.

Je sais pas trop comment m'y prendre.
L'utilisation de BETWEEN peut être intéressante pour ce que j'ai lu du sujet.
Pages : 1 2