JeuWeb - Crée ton jeu par navigateur
Optimiser une map - 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 : Optimiser une map (/showthread.php?tid=744)

Pages : 1 2


Optimiser une map - sff - 01-02-2007

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>';



RE: Optimiser une map - denisc - 01-02-2007

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


RE: Optimiser une map - Seren - 01-02-2007

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.


RE: Optimiser une map - Shudrum - 02-02-2007

Parfois on n'a pas le choix, perso, cela ne m'a jamais embêté de les mettre dans les boucles.


RE: Optimiser une map - pascal - 02-02-2007

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


RE: Optimiser une map - denisc - 02-02-2007

Merci d'avoir expliqué ce que je lui ai recodé Tongue


RE: Optimiser une map - pascal - 03-02-2007

il faut documenter son code Tongue


RE: Optimiser une map - sff - 03-02-2007

Excusez moi j'étais absent durant la semaine, merci de votre aide, je teste ca tout de suite.


RE: Optimiser une map - sff - 03-02-2007

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.


RE: Optimiser une map - Loetheri - 03-02-2007

L'utilisation de BETWEEN peut être intéressante pour ce que j'ai lu du sujet.