JeuWeb - Crée ton jeu par navigateur
Performances MySql - 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 : Performances MySql (/showthread.php?tid=421)

Pages : 1 2 3


RE: Performances MySql - pascal - 14-11-2006

pour les soleils et les astéroïdes, comme ils ont pour taille 0, tu peux en créer le nombre voulu en une requete par type d'astre:
Code :
INSERT INTO galaxie ( coordonnee_x, coordonnee_y, taille, type_astre)
SELECT x, y, 0, 'sun' FROM ...
WHERE les conditions ...
LIMIT 0, n

avec n = le nombre d'astres à insérer et le SELECT = la mega requête que je t'ai filée l'autre jour.

ça devrait diminuer pas mal le nombre de requetes au moins pour cette partie là.

ensuite je ferai pareil pour les planetes, mais avec n=1.

A+

Pascal


RE: Performances MySql - joshua - 14-11-2006

Je suis OK pour les asteroides car ce sont des corps astrals simples. Idem pour les soleils, sauff que les soleils arrivent en premier, placer 3 points parmi 10 000 ca consomme aps trop de requetes. Par contre, pour les planetes comme je t'ai dit la derniere fois c'est impossible, car il existe encore d'autres paramètres a spécifier pour chaque planete. Actuellement je les ai mis statiques, mais a terme, ils seront dynamiques....


RE: Performances MySql - gtsoul - 14-11-2006

là je suis plus,
il faudrait reconcevoir le système.
Si tu pouvais expliquer en language naturel, les différentes étapes de ton script; et l'architecture de ta base, je pourrais t'aider.


RE: Performances MySql - joshua - 14-11-2006

en fait on en a discuté un peu avec pascalje sur msn. Y a peut etre une solution en passant par une base temporaire.
EnGros, mon but est de placer des planetes dans la carte.
Chaque planete a un rayon d'attraction plus ou moins grand (de 1 à 5)
deux rayons d'actions ne peuvent pas se croiser.
Il existe déja dans la carte des soleils (avec rayons d'actions de 5 à 10 ) et des champs d'asteroide (R.A=0)
Donc on souhaite placer des points dans la carte respectant ces regles, et un maximum de points gros puis des plus petits etc... jusqu'au rayon de 1.

Bien sur pour voir si deux planetes peuvent etre cote à cote, on fait un joli petit pythagore: (Ax-Bx)²+(Ay-By)² >(At+Bt)²
avec Ax l'abscisse de A, Ay l'ordonnée de A, et At la taille du corps astral A.


Donc la solution que j'ai trouvé, en francais:
Je choisis le plus gros rayon de planete possible (5)
Je fais une requete en base qui me sort tous les resultats pour lesquels avec ce rayon je peux placer des planetes, et je mets tous ces resultats dan une table temporaire.
Je prends le premier de ses resultats et je l'insere en base. Je supprime de la base temporaire tous les resultats qu'il annule.
Je reitere l'operation jusqu'a ce que la table temporaire soit vide.
Je reitere ces operations jusqu'à arriver au rayon de (1)

Hop!
Du coup j'ai divisé mon nombre de requete de maniere monumentale je pense....


RE: Performances MySql - max - 14-11-2006

pfiouuuuu
ba dit donc
moi ca me dépasse ^^
juste 1 petite question, a quoi ca sert les rayons d'attraction???


RE: Performances MySql - joshua - 14-11-2006

Ca te sert a définir une zone d'ingfluence autour de chaque planete, dans laquelle tu pourras placer des lunes. Ca te sert aussi a définir quel sera le climat de la planete (en fonction de ses distances par rapport aux différents soleils et a la taille des soleils. Ca te sert aussi a avoir uen galaxie qui soit autre chose que des points mis n'importe comment :d


RE: Performances MySql - gtsoul - 14-11-2006

j'aurais bien tenté le hasard :

//initialisation
tu places un nombre n de planètes de taille 5 dans le plus grand des hasards
//correction
tu supprimes celles qui entrent en conflit (seulement une des deux, celle qui a le plus grand id par exemple)

tant que le nb de planètes placées est inférieur au nombre que tu souhaites (ne pas oublier une condition qui fixe le nb max d'itérations):
{
tu supprimes celles qui entrent en conflit (seulement une des deux, celle qui a le plus grand id par exemple)
puis tu tentes de replacer le nombre de planètes que tu as déleté au hasard
}

puis tu continues pour chaque type de planète.
Si j'avais voulu créer le big bang, j'aurais résonné de cette manière. L'univers n'est pas régi de manière particulière, si ce n'est que deux planètes trop proches se détruisent pour n'en former qu'une.

/*----------------------------- une autre approche ------------------------------*/
celle-ci est plus rapide et plus naturelle. au lieu de préférer une planète à une autre, on fusionne les deux. Cette méthode favorise les vides et les regroupements chaotiques, alors que les autres favorisent une répartition plus régulière.

tu commences avec des planètes de type 1
tu places un nombre n de planètes de taille 1 dans le plus grand des hasards
puis régulierement, jusqu'à ce qu'il n'y ait plus de conflits ou qu'une planète atteigne une taille critique ou atteigne un nombre max d'itération
tu supprimes celles qui entrent en conflit (seulement une des deux, celle qui a le plus petit poids puis le plus grand id par exemple) et les fusionne en leur centre en une planète égale à la somme des poids.


RE: Performances MySql - joshua - 14-11-2006

Je comprends ce que tu veux dire.
Mais mon souhait était le suivant: avoir un alea qui me permette d'eviter que toutes les galaxies soient les memes.
Placer un maximum possible de grosses planetes puis combler les trous.
Au début j'ai tenté de faire "au hasard" mais je me suis vite retorouvé avec des choses impossibles, car non seulement ma base explosait, mais en plus au bout d'un moment tout bouclait....
Donc j'ai trouvé la solution: mon alea m'est donné par les champ d'asteroides et les soleils. Les planetes ensuite comblent les trous.
Ca me fait en totu environ 300 corps astraux par galaxie.... ce qui est peu!


RE: Performances MySql - pascal - 14-11-2006

tu peux aussi faire:
_ placer les soleils en quelques requetes
_ placer les astéroïdes en une requete

puis placer les planetes:
_ tu en places le maximum de rayon = 5 en une seule requete, comme les astéroïdes
_ tu détectes et effaces celles qui entrent en conflit
_ tu recommences en diminuant le rayon jusque 1

le point qui pose problème est la ( les) requete/s pour effacer les planetes en conflit, mais ça serait sûrement moins gourmand qu'actuellement.

A+

Pascal


RE: Performances MySql - joshua - 14-11-2006

d'ou qu'il est mon pb?

Code PHP :
<?php 
INSERT INTO tbl_planete_tmp
( `id` , `coordonnee_x` , `coordonnee_y` )
SELECT *
FROM tbl_planete
WHERE
(
`
coordonnee_x` - `tbl_planete.coordonnee_x`
) * ( `
coordonnee_x` - `tbl_planete.coordonnee_x` ) + ( `coordonnee_y` - `tbl_planete.coordonnee_y` ) * ( `coordonnee_y` - `tbl_planete.coordonnee_y` ) <= ( `tbl_planete.taille` +5 ) * ( `tbl_planete.taille` +5 )
AND `
coordonnee_x` >5
AND `coordonnee_x` <94
AND `coordonnee_y` >5
AND `coordonnee_y` <94

MySQL a répondu
:Documentation
#1054 - Unknown column 'tbl_planete.coordonnee_x' in 'where clause'