Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Distance entre position d'un draw et du centre de la vue  (Lu 4198 fois)

0 Membres et 2 Invités sur ce sujet

gaulois94

  • Sr. Member
  • ****
  • Messages: 259
    • Voir le profil
Distance entre position d'un draw et du centre de la vue
« le: Juillet 13, 2013, 10:34:33 pm »
Bonsoir,

Alors voila mon problème. Supposons une fenêtre de (800,600) et une vu de (800,600) de centre (400,300) appliqué à cette fenêtre, ainsi qu'un drawable de position (x, y). Si je zoom 2 fois (bien que j'ai plus l'impression que sa dézoom x) ), mon centre n'a pas bougé mais la taille de la vue à été multiplié par deux. Ce que je souhaite savoir, c'est la nouvelle position de ce drawable dans la fenêtre. Pour cela, voici la petit fonction que j'ai essayé de faire :

positionFenêtre = position + de Combien C'est Rapproché LeDrawable vers le centre de la vue + centre Fenêtre - view.center (je ne vais pas complexifié les choses avec des Frames dans une fenêtre par exemple, bien que j'ai mon idée de comment faire).

Ce qui me manque, c'est la valeur qui me dit de combien c'est rapproché le drawable vers le centre de la vue.... Je sais faire avec des zoom "entier", mais pas décimaux !!!! Une idée ?

Merci d'avance :D

Xaychru04

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #1 le: Juillet 14, 2013, 01:43:01 am »
Il y a beaucoup plus simple. Imagine que ta vue soit tournée, il serait encore plus dur de connaitre la position du Drawable sur la fenêtre. Il suffit juste d'appeler la méthode
mapCoordsToPixel (const Vector2f &point) const
de ta fenêtre avec comme paramètre la position du Drawable, et elle va te renvoyer sa position dans la fenêtre.
(Et pour zoomer deux fois par exemple, il faut passer 0.5f comme paramètre au zoom. ;) )
« Modifié: Juillet 14, 2013, 01:46:14 am par Xaychru04 »

gaulois94

  • Sr. Member
  • ****
  • Messages: 259
    • Voir le profil
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #2 le: Juillet 14, 2013, 11:00:42 am »
C'était aussi simple ? Et dire que je cherchait durant des lustres comment faire x) . Merci beaucoup :D

gaulois94

  • Sr. Member
  • ****
  • Messages: 259
    • Voir le profil
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #3 le: Juillet 25, 2013, 04:45:16 pm »
Il y a juste un soucis avec ces fonctions : elles sont très lentes. En effet, à l'aide d'un Profiler en python (j'utilise le binding python de la sfml), la fonction convert_map_point_to_screen bouffe énormément de ressources, c'est normale ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #4 le: Juillet 25, 2013, 04:56:31 pm »
Tout dépend ce que tu appelles "énormément de ressources". Et est-ce que ton profiler instrumente uniquement le code Python, ou bien l'application dans sa globalité ?

Mais en théorie non, ces fonctions ne sont pas censées être très lourdes.
Laurent Gomila - SFML developer

gaulois94

  • Sr. Member
  • ****
  • Messages: 259
    • Voir le profil
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #5 le: Juillet 25, 2013, 05:37:02 pm »
J'utilise cette fonction une fois par frame par entité graphique affiché à l'écran qui peut avoir un focus (cette fonction me sert à savoir où se situe l'objet par rapport à la souris). Lorsque je met à jours le focus des entités, j'ai une baisse importante de framerate. Voici le résultat d'un profiler :

http://sprunge.us/RgZD

et la ligne correspondante à la fonction :
"4304    1.382    0.000    1.382    0.000 {method 'map_coords_to_pixel' of 'sfml.graphics.RenderWindow' objects}"

Sur 15 secondes, sachant que je n'update le focus que si la souris bouge (pour éviter de trop update inutillement), elle me prends 1.4 secondes, ce qui est assez énorme je trouve (c'est la troisième fonction à prendre le plus de ressources "tottime = temps total passé dans cette fonction sans compter les sous fonctions qu'elle appel". cumtime : "temps cumulé passé dans cette fonction en compter le temps passé dans les sous fonctions appelé par celle ci".)

Je voulais savoir, c'est le carte graphique ou bien le processeur qui fait la conversion ?
« Modifié: Juillet 25, 2013, 05:46:51 pm par gaulois94 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #6 le: Juillet 25, 2013, 05:51:11 pm »
C'est le processeur.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #7 le: Juillet 25, 2013, 07:13:32 pm »
Je trouve aussi que pas mal de fonctions de cette librairies sont, hum, lente, quand j'utilise le profiler mais en c++, me semblait bien que il n'y avait pas que moi.

Il m'a fallut faire un code vraiment très optimisé et avec ça j'ai un framerate de 20, je mesure ça avec la classe clock mais j'ai 4 threads qui tourne en parallèle donc je ne sais pas si je peux me baser sur le framerate dans le cas ou j'utilise plusieurs thread. (Je ne pense pas.)

Mais bref mon appli n'est pas grande, elle fait appel aussi à des fonctions du genre mapCoordsToPixelassez souvent. (A chaque fois que le personnage se déplace.)
Et bon ça ralentis quand même beaucoup ce genre de fonction, dès que mon personnage se déplace j'ai mon framerate qui baisse de beaucoup. :/

Et pourtant j'ai optimisé à mort mon algortihme sinon ça ne tournais pas du tout, je ne fais juste que de récupérer les tiles dans la caméra avec une boucle, dans laquelle j'utilise une bête formule et puis j'insère la tile dans un std::vector (je ne fais même pas de tri, ni de test pour savoir si une tile est dans le rectangle de la caméra, non, je prend la position de la caméra et je vais jusqu'à la fin de la caméra en avançant de x et de y et je récupère à chaque fois la tile qui se trouve en x, y avec une formule, bref, je saurai pas faire mieux au niveau optimisation :

//Recherche les sprites qui sont visible à l'écran.
void GridMap::checkVisibleTiles (Vector2f &centerView) {
    visibleTiles.clear();
    visibleAnims.clear();
    visibleMonsters.clear();
    int x = (centerView.x - Configuration::getConfiguration().x / 2) - 100;
    int y = (centerView.y - Configuration::getConfiguration().y / 2) - 50;
    int endX = (centerView.x - Configuration::getConfiguration().x / 2) + Configuration::getConfiguration().x + 100;
    int endY = (centerView.y - Configuration::getConfiguration().y / 2) + Configuration::getConfiguration().y + 50;
    BoundingRectangle br(x, y, Configuration::getConfiguration().x + 100, Configuration::getConfiguration().y + 50);

    for (int l = 0; l < NB_LAYERS; l++) {
        for (int i = x / 100 * 100; i <= endX / 100 * 100; i+=100) {
            for (int j = y / 50 * 50; j <= endY / 50 * 50; j+=25) {
                int deltaX = (j % 50 == 0) ? 0 : 50;

                Vec2f point(i + deltaX, j);
                CellMap* cell = getGridCellAt(point);
//Et j'insère tous les sprites qui sont dans la cellule, dans un std::vector pour pouvoir ensuite les afficher à l'écran.
 


Malgré ça, ça ralenti à mort les performances, c'est pas injouable mais je vois mon framerate baisser pas mal. (J'ai même appeler cette méthode toutes les secondes seulement tellement que la fait de modifier la vue et convertir les coordonnées ça fait ralentir mon jeux.) :/
Essaye d'éviter d'appeler ses fonction trop souvent.
« Modifié: Juillet 25, 2013, 07:21:17 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #8 le: Juillet 25, 2013, 07:39:02 pm »
Première chose, je ne vois aucun appel à une quelconque fonction SFML dans ce code, alors ça sert à quoi de le poster, si ce n'est contredire ce que tu viens de dire ?

Deuxième chose, je ne vois pas pourquoi tu aurais besoin de mapCoordsToPixel. Cette fonction a une utilité ultra restreinte, d'ailleurs elle n'a été ajoutée que très récemment.

Et enfin, au lieu de poster des murs de texte et de code, fais donc un petit benchmark rigoureux de(s) fonction(s) incriminée, voire une analyse du code, ou un profiling comme gaulois94. Sinon ça ne nous avancera à rien.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Distance entre position d'un draw et du centre de la vue
« Réponse #9 le: Juillet 25, 2013, 08:45:39 pm »
Le mapPixelToCoords, je le fais pour convertir les coordonnées de la souris en coordonnées vue, donc, à chaque fois que je bouge la souris.
Donc, assez souvent quand même. ^^

Je parlais de la fonction mapPixelToCoords excuse moi.

Mais bon y'a pas que cette fonction là je dois faire plus d'analyse comme tu dis.

Je ferai ça plus tard quand j'attaquerai la partie optimisation de la sfml dans mon projet, mais les fonctions move et tout ça semble pomper pas mal aussi.

En tout cas j'ai remarqué que c'était plus rapide avec la SFML 1.6 de ce côté là. (Du côté des vues donc.)