JeuWeb - Crée ton jeu par navigateur
Optimisations (SQL&autres) - 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 : Optimisations (SQL&autres) (/showthread.php?tid=987)



Optimisations (SQL&autres) - Draedrus - 28-03-2007

Bonjour, je suis un maniaque au niveau de mes projets en général et surtout de celui-ci. Il faut toujours que mon programme soit le plus rapide possible ( quand j'ai le temps de m'en préoccuper ). Alors voilà récemment j'ai changé mon modéle d'affichage de carte par une simple image générée en imageGD, ainsi qu'une carte servant de radar utilisant le même systéme mais avec des pixels et non des images. Or le tout me fait 7 requettes SQL et ça me travaille je me demande si celà n'est pas éxcéssif ? 7 requettes sur une page de jeu.


RE: Optimisations (SQL&autres) - Sephi-Chan - 28-03-2007

En effet, 7 requêtes ça commence à faire pas mal. Ensuite si tu as déjà limité ce nombre en utilisant jointures, requêtes mieux pensées et compagnie, tu ne peux pas faire de miracles non plus, hein.
Puis il y à requête et requête. Si c'est un count() ou que sais-je de léger, ce n'est pas des plus dramatiques.

Par contre, je ne suis pas certain qu'utiliser GD soit une bonne optimisation ! oO
Ou alors si s'en est une, le script de base devait être sacrément glouton niveau ressources. ^^

C'est tout de même très lourd de créer une image à chaque fois, tu ne trouves pas ?


Sephi-Chan


RE: Optimisations (SQL&autres) - Draedrus - 28-03-2007

Oui c'est ce que je me suis dit ! Mais ça m'a semblé plus joli que mon horrible tableau en html Smile, et puis maintenant j'ai des personnages qui font plusieures cases comme des dragons ou la mascotte du jeu ( un Ogre affectueusement appelé Timmy ). Donc étant donné que je perds en désign du site je gagne en affichage de jeu =) et puis ça rame pas plus qu'avant, enfin je pense Big Grin. J'ai déjà vu d'autres jeux tourner avec imageGD ça ne semblait pas trop gêner Wink.


RE: Optimisations (SQL&autres) - Roworll - 29-03-2007

Tu as essayé de faire un test de charge avec GD ? Du genre 5, 10, 20, 50, 100 utilisateurs qui demandent la même page de manière plus ou moins synchro ?
J'ai toujours eu des réticences à utiliser cette librairie et même dans ce cas, jamais pour des affichages dynamiques.
Maintenant, peut être que je me trompe et qu'elle est très performante au niveau traitement et gestion de la mémoire.
Je n'ai pas d'avis tranché sur la question, je suis juste méfiant.


RE: Optimisations (SQL&autres) - Sephi-Chan - 29-03-2007

Idem, je suis méfiant des performances de GD.

Tu peux tester un peu sur une boucle de 1000 itérations avec un microtime() pour en savoir un peu plus.

La seule bonne utilisation que je lui trouve, c'est la création de texte. Si par exemple on veut que nos news aient un joli titre sans faire une image manuellement, il suffit de générer l'image à la création de la news, et on l'enregistre avec le même nom que la news (un peu parsé éventuellement) dans un répertoire prévu pour, ensuite la news fait simplement appelle à une image ayant son titre pour nom suivi d'une extension, et on met en alt le titre (en "vrai" texte).


Sephi-Chan


RE: Optimisations (SQL&autres) - NicoMSEvent - 29-03-2007

si c'est juste pour positionner une image sur une autre image, essaye avec un gif ou png transparent dans un div, qui te le positionnera correctement (surtout si tu veux pourvoir cliquer dessus).
Sinon, tu ne pourrais pas utiliser un système de cache? (genre creer ton image une fois, et par la suite vérifier si les données ont changé -> recreer l'image, ou pas)

Sinon, pour ton sql, si tu publies tes requetes ici, nous pourrons certainement trouver des optimisations, ou du moins donner un point de vue par rapport a ta logique, et qui sait, peut-etre te donner des idées...


RE: Optimisations (SQL&autres) - Draedrus - 29-03-2007

J'avais déjà essayé avec des div et de superposer tout ça, mais bon... ça ne m'a pas plu. Je testerais éventuellement un chargement avec microtime() comme cité plus haut.

Au niveau des requettes j'ai donc une demande de position du joueur qui cherche à afficher la carte:
SELECT x,y FROM players WHERE id='id_du_joueur'
une autre requette pour connaître le nombre de messages sous forme de count:
SELECT count(*) AS nb FROM messages WHERE destinataire='id_du_joueur'

Ensuite deux images générées, la premiére re-demande une position:
SELECT x,y FROM players WHERE id='id_du_joueur'
Puis les objets environnants ( forets, maisons, rivieres, routes... ):
SELECT type,x,y FROM obstacles WHERE SQRT(('x_joueur'-x)^2+('y_joueur'-y)^2)<='vue'
la vue varie selon le jour et la nuit ( 2 le jour, 1 la nuit ).
Suivie d'une requette cherchant tout joueur dans les parages:
SELECT race,classe,x,y FROM players WHERE SQRT(('x_joueur'-x)^2+('y_joueur'-y)^2)<='vue' AND etat!='mort'

La deuxieme image génére donc l'entourage du joueur en pixels:
SELECT x,y FROM players WHERE id='id_du_joueur'
Puis les objets environnants ( forets, maisons, rivieres, routes... ):
SELECT type,x,y FROM obstacles WHERE SQRT(('x_joueur'-x)^2+('y_joueur'-y)^2)<='vue'
la vue varie selon le jour et la nuit ( 2 le jour, 1 la nuit ).

Voilà pour mes requettes au nombre de 7. J'avais pensé passer la position du joueur en sessions pour supprimer les deux requettes. Et le reste je ne sais pas encore si je peux l'optimiser plus. Merci à tous pour vos réponses Wink

PS: l'image en cache ne serait pas plus lourde ? sachant qu'il faudrait vérifier à chaque fois si l'image a bougé, qu'il faut la remettre en cache à chaque fois et que se déplacer est l'une des choses que l'on fait souvent dans mon jeu ( de bourrins faut dire ). Sinon, comment le mettre en place ? Je ne me suis jamais posé la question.

[édit]: aprés essai, ma page s'affiche aux alentours de 0.5 secondes si je le mets dans une boucle s'effectuant 100 fois de suite, 0.03 pour une seule fois. Au bout de 500 fois la page ne s'affiche plus, mais déjà arriver à 100 joueurs actifs et d'un coup me parait peu probable Smile. C'est assez bien ou faut-il encore améliorer des choses ? sachant que j'ai mis le moins d'espace possible entre les connexions mysql et que j'ai enlevé les deux autres quêtes en utilisant les sessions.


RE: Optimisations (SQL&autres) - NicoMSEvent - 29-03-2007

Draedrus a écrit :...
Ensuite deux images générées, la premiére re-demande une position:
SELECT x,y FROM players WHERE id='id_du_joueur'
Je pense que cette requete est nécessaire
Draedrus a écrit :Puis les objets environnants ( forets, maisons, rivieres, routes... ):
SELECT type,x,y FROM obstacles WHERE SQRT(('x_joueur'-x)^2+('y_joueur'-y)^2)<='vue'
la vue varie selon le jour et la nuit ( 2 le jour, 1 la nuit ).
Les objets environnants ne devraient (a mon avis) pas changer souvent. On ne pourrait pas en faire une image fixe, qui servirait de base pour générer les autres images? (une pour le jour, une pour la nuit)
Draedrus a écrit :Suivie d'une requette cherchant tout joueur dans les parages:
SELECT race,classe,x,y FROM players WHERE SQRT(('x_joueur'-x)^2+('y_joueur'-y)^2)<='vue' AND etat!='mort'
ceci aussi me semble indispensable
Draedrus a écrit :La deuxieme image génére donc l'entourage du joueur en pixels:
SELECT x,y FROM players WHERE id='id_du_joueur'
Puis les objets environnants ( forets, maisons, rivieres, routes... ):
SELECT type,x,y FROM obstacles WHERE SQRT(('x_joueur'-x)^2+('y_joueur'-y)^2)<='vue'
la vue varie selon le jour et la nuit ( 2 le jour, 1 la nuit ).
ces requetes me semblent tres proche des requetes précédentes... tu ne pourrais pas utiliser les requetes précédentes plus intelligemment?
Draedrus a écrit :Voilà pour mes requettes au nombre de 7. J'avais pensé passer la position du joueur en sessions pour supprimer les deux requettes.
Pour le joueur courant, ok. Par contre, tu dois quand meme faire un update pour que les autres joueurs puissent voir en direct tes propres mouvements
Draedrus a écrit :Et le reste je ne sais pas encore si je peux l'optimiser plus. Merci à tous pour vos réponses Wink
parfois, ce n'est pas une optimisation qu'il faut, mais une refonte de la logique ;-)
Draedrus a écrit :PS: l'image en cache ne serait pas plus lourde ? sachant qu'il faudrait vérifier à chaque fois si l'image a bougé, qu'il faut la remettre en cache à chaque fois et que se déplacer est l'une des choses que l'on fait souvent dans mon jeu ( de bourrins faut dire ). Sinon, comment le mettre en place ? Je ne me suis jamais posé la question.
il me semble que tu pourrais avoir une table avec les données de l'image, que tu comparerais avec les données dans la base de donnée (moins couteux en ressource que de manipuler l'image).
Et donc, tu re-génererais l'image que si tu en a réellement besoin (c'est une piste, je ne prétends pas que c'est LA meilleure solution Wink )
Draedrus a écrit :[édit]: aprés essai, ma page s'affiche aux alentours de 0.5 secondes si je le mets dans une boucle s'effectuant 100 fois de suite, 0.03 pour une seule fois. Au bout de 500 fois la page ne s'affiche plus, mais déjà arriver à 100 joueurs actifs et d'un coup me parait peu probable Smile.
c'est pas mal du tout... p-e que tu pourrais encore doubler ce nombre avec les bonnes optimisations Wink


RE: Optimisations (SQL&autres) - Draedrus - 29-03-2007

Arg, je me rends compte qu'on a pas du se comprendre ! Enfaite la zone visible du joueur ne représente que 13 cases sur les 121x121 du tableau de jeu ( qui ne sont pas encore toutes faites d'ailleurs mais grâce à l'éditeur que j'ai programmé ça avance vite ). Donc je ne vois pas comment mettre en cache pour chaque joueur chaque image représentant la visibilité du joueur Confused. Enfaite les joueurs voient ceci:

[Image: carteimg.php.png]
qui est la vision directe du personnage et ceci, le "radar":
[Image: carteradar.php.png]
qui représente tout ce que peut vaguement apercevoir le personnage sans réellement l'apercevoir. Bref ce qu'il y a autour

qui n'est qu'un fragment de la map Smile, d'où la nécéssité de connaître la position du joueur et des autres joueurs Smile
Enfin si tu n'as pas tout saisi tu me fais signe je peux approfondir le systéme ^^'

PS: "c'est pas mal du tout... p-e que tu pourrais encore doubler ce nombre avec les bonnes optimisations", merci ! Je pensais au contraire que c'était nul ( je passe mon temps à être pessimiste ). Donc il y a de l'espoir xD