JeuWeb - Crée ton jeu par navigateur
Map : trop de requetes - 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 : Map : trop de requetes (/showthread.php?tid=3427)

Pages : 1 2 3


RE: Map : trop de requetes - sagaff - 14-12-2008

Pourquoi chez toi le nombre de connexion sql est limité à combien?


RE: Map : trop de requetes - Sephi-Chan - 14-12-2008

Là n'est pas la question.
Le problème, c'est plutôt que le serveur n'arrive pas à gérer toutes ces requêtes : soit le serveur est trop faible, soit les requêtes ne sont pas optimisées. Ici, je pense qu'on est dans le cas des requêtes qui ne sont pas optimisée.

Ce que tu pourrais faire, c'est donc une jointure sur les coordonnées dans ce genre :
Code PHP :
<?php 
SELECT cases
.*,
coffres.nom AS coffre_nom, # Tu spécifies
coffres.x AS coffre_x, # les champs utiles
coffres.y AS coffres_y, # un par un et tu
clans.nom AS clan_nom, # leurs donne un
clans.x AS clan_x, # alias pour éviter
clans.y AS clan_y, # les collisions de nom.
personnages.id AS personnage_id
personnages
.nom AS personnage_nom
FROM cases
LEFT JOIN coffres
ON coffres
.x = cases.x
AND coffres.y = cases.y
LEFT JOIN clans
ON clans
.x = cases.x
AND clans.y = cases.y
# Autres jointures…
LEFT JOIN personnages
ON personnages
.x = cases.x
AND personnages.y = cases.y
WHERE cases
.x BETWEEN x_min AND x_max
AND cases.y BETWEEN y_min AND y_max

Si dans ton système il ne peut y avoir qu'une seule chose par case, tant mieux, sinon il faudra gérer ça du côté de PHP puisqu'avec cette requête, si une case contient 1 personnage et 1 coffre, il y aura 2 lignes pour cette case : ce qui risque de bordeliser ton tableau.

Voilà une piste, à toi d'y travailler et de poser tes questions. Smile


Sephi-Chan


RE: Map : trop de requetes - SeigneurMartin - 14-12-2008

Bah, ça dépend ses moyens, combien il paie son hébergeur.
Mine de rien, pas tout le monde a de quoi s'offrir ou s'installer chez soi un serveur dédié !

Edit Sephi-Chan : On évite de dériver s'il vous plaît. ^^


RE: Map : trop de requetes - sagaff - 14-12-2008

je serais incapable de mettre en œuvre cette jointure Sephi-Chan. Il faudrait que quelqu'un m'aide.


RE: Map : trop de requetes - Sephi-Chan - 14-12-2008

Commence par être plus précis, ensuite on pourra t'aider.
Qu'est-ce qui te pose problème ? La syntaxe ? Le fonctionnement ? Etc.


Sephi-Chan


RE: Map : trop de requetes - sagaff - 14-12-2008

Le code complet de la map est ici : http://sitedemickael.chez-alice.fr/map.txt

Sephi-Chan avec l'exemple que tu m'a donné, je suis incapable de faire la jointure.

Je peux au mieux mettre les véritables nom de table :

Code PHP :
<?php 
$mapquery
= "SELECT cases.*,
rpg_coffers.name AS rpg_coffers,
rpg_coffers.x AS coffre_x,
rpg_coffers.y AS rpg_coffers_y,
rpg_clans_elements.name AS rpg_clans_elements,
rpg_clans_elements.x AS clan_x,
rpg_clans_elements.y AS clan_y,
rpg_users.id AS personnage_id
rpg_users.charname AS rpg_users
FROM cases
LEFT JOIN rpg_coffers
ON rpg_coffers.x = cases.x
AND rpg_coffers.y = cases.y
LEFT JOIN rpg_clans_elements
ON rpg_clans_elements.x = cases.x
AND rpg_clans_elements.y = cases.y

LEFT JOIN rpg_users
ON rpg_users.x = cases.x
AND rpg_users.y = cases.y
WHERE cases.x BETWEEN x_min AND x_max
AND cases.y BETWEEN y_min AND y_max"
;


Mais on est très très loin surement de ce qu'on devrait avoir.


Les tables nécéssaires :

rpg_users (champs : id, charname, avatar, longitude, latitude)
rpg coffers (champs : name, longitude, latitude)
rpg_clans_elements (champs : pic, longitude, latitude)
rpg_map (champs : longitude, latitude, pic)
rpg_towns (champs : name, longitude, latitude)
rpg_teleportations (champ : name, longitude, latitude)
rpg_packages_offices (champs : name, longitude, latitude)


RE: Map : trop de requetes - Sephi-Chan - 14-12-2008

En fait, il faut comprendre comment ça marche. Ensuite, il te suffira de faire des essais dans phpMyAdmin.

Voyons comment fonctionne la requête :
Code PHP :
<?php 
SELECT cases
.*,
coffres.nom AS coffre_nom, # Tu spécifies
coffres.x AS coffre_x, # les champs utiles
coffres.y AS coffres_y, # un par un et tu
clans.nom AS clan_nom, # leurs donne un
clans.x AS clan_x, # alias pour éviter
clans.y AS clan_y, # les collisions de nom.
personnages.id AS personnage_id
personnages
.nom AS personnage_nom
FROM cases
LEFT JOIN coffres
ON coffres
.x = cases.x
AND coffres.y = cases.y
LEFT JOIN clans
ON clans
.x = cases.x
AND clans.y = cases.y
# Autres jointures…
LEFT JOIN personnages
ON personnages
.x = cases.x
AND personnages.y = cases.y
WHERE cases
.x BETWEEN x_min AND x_max
AND cases.y BETWEEN y_min AND y_max

Dans un premier temps, MySQL va sélectionner les informations de la table cases, qui contient les cases de ta carte (avec leur coordonnées x et y).
Il commence donc à chercher dans la table (en restant de la cadre de sa clause WHERE), il commence une boucle.

Comme on lui à indiqué par la ligne LEFT JOIN coffres ON coffres.x = cases.x AND coffres.y = cases.y. Là il regarde dans la table coffres s'il y a des coffres dont le champ x a la même valeur que le champ x de la case qu'il parcourt. Il fait la même chose avec le champ y du coffre, qu'il compare avec le champ y de la case.
S'il trouve quelque chose, il remplit les cases qui concernent les coffres.
Si non, il met des valeurs nulles dans ces cases.

Ensuite, il évalue la jointure suivante de la même manière.
Quand il a fini d'évaluer les jointures, il passe à la case suivante, avec laquelle il recommence ce processus.

Au final, il a un tableau contenant toutes les cases (une ligne par case) avec des informations ou pas dans les cases.

Entraîne-toi à faire des jointures dans ton phpMyAdmin en n'en faisant qu'une (celle des coffres, par exemple), puis quand ça marche comme tu le souhaite, tu en rajoutes une, et ainsi de suite.

N'oublie pas également de nous préciser si une case peut accueillir plusieurs éléments (coffre, personnage, etc.), car ça complique un peu la chose.


Sephi-Chan


RE: Map : trop de requetes - Holy - 14-12-2008

Je rappelle juste que faire plus de 12 requêtes sql par déplacement, c'est juste énorme ^^

D'abord, faire une grosse jointure, c'est une très bonne chose. Mais j'insiste, un système de cache ne peut qu'être bénéfique, pour les éléments qui sont relativement fixes. C'est toujours ça en moins qui viendra engorger ton accès à ta base.

Voici un bête exemple:
Code PHP :
<?php
// Script de mise en cache
$MAP = ARRAY(
'1001545653212',
'9988931232144',
'6116142334556'
);

$CacheMap = serialize($MAP);
file_put_contents('./cache/DecorMap', $CacheMap);
?>
Code PHP :
<?php
// Récupération du cache
$CacheMap = file_get_contents('./cache/DecorMap);
$Map = unserialize($CacheMap);
// $Map sera égal au tableau situé un peu plus haut
?>

Je pense que si tu créais rapido un petit module de mise en cache pour des éléments comme le décor, ça permettrait d'éviter de devoir aller chercher dans ta BDD des données supplémentaires.

Je pense que l'une des meilleures manières d'optimiser les performances, c'est de multiplier les accès aux données, pour équilibrer le tout.[/php]


RE: Map : trop de requetes - sagaff - 14-12-2008

Je tiens à préciser que la map étant relativement grande, compte plus de 200 000 enregistrements dans le table map. Est ce que ton système de cache tient toujours?

Le fichier de cache sera surement conséquent à charger à chaque déplacement. Non?


RE: Map : trop de requetes - Holy - 15-12-2008

(14-12-2008, 11:41 PM)sagaff a écrit : Je tiens à préciser que la map étant relativement grande, compte plus de 200 000 enregistrements dans le table map. Est ce que ton système de cache tient toujours?

Le fichier de cache sera surement conséquent à charger à chaque déplacement. Non?

Tu peux découper ta map, et la disposer dans plusieurs fichiers cache.

Prenons un exemple simple:
La map fait 200 x 200. Tu la coupes en 4 et tu dispatches ça dans 4 fichiers.

Suffit d'avoir une petite fonction qui te permet de déterminer le fichier à appeler en fonction du x et du y.