Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Archimed78 le Octobre 30, 2012, 05:01:33 pm

Titre: [SFML2] Optimisation déplacement
Posté par: Archimed78 le Octobre 30, 2012, 05:01:33 pm
Bonjour a tous, merci d'avance pour la/les futurs réponses que vous pourriez m'apporter.

J'ai un problème lors du déplacement de plusieurs sprites a la suite.
J'ai une map de 20*20 cases (sa peu varier) avec des sprites de 32px. Mais cette map est constitué de 3 couches successive. J'ai donc 20*20+20*20+20*20 = 1200 sprites afficher. En réalité les couches 2 et 3 ne sont pas pleine donc sa fais relativement moins. Mais théoriquement on pourrais allé a 1200 sprites max.

Lors de l'affichage aucun soucis, mais lors du déplacement (move de sf::Sprite) de chaque sprite pour faire déplacer la map, la il y a une sacré chute du FPS.

Ma question est donc la suivante : Existe t'il un moyen de déplacement toute la map sans attiré les foudres du FPS ? Existe t'il un conteneur permettant de déplacement tout ce petit monde et donc évité 1200 tour de boucles ?

Je vous remercie énormément.

Cordialement.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: lezebulon le Octobre 30, 2012, 06:44:10 pm
ben sf::View...
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Koryushin le Octobre 30, 2012, 07:59:15 pm
Pour plus de précisions  ;D au lieu de déplacer tous tes sprites dans une direction ben tu déplace une sf::view dans la direction opposée   :P
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Archimed78 le Octobre 30, 2012, 10:05:39 pm
Merci bien, je ne connaissais pas les sf::View, mais au niveau de performance (a part évite les 1200 boucles), comment est-ce géré ? Comment cela améliora les performances ?

Je vais de mon coté bien évidemment travaillé la dessus et vous tenir informé.

Merci beaucoup,

Cordialement.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Laurent le Octobre 30, 2012, 10:30:08 pm
Citer
Comment cela améliora les performances ?
Les vues ne coûtent pas un copec. C'est totalement gratuit, ça n'implique aucun calcul en plus.

Citer
comment est-ce géré ?
Ca change la matrice de projection d'OpenGL. Si ça ne te parle pas, on va éviter d'entrer dans le détail, ce serait un peu compliqué à expliquer :P
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Archimed78 le Octobre 30, 2012, 11:16:40 pm
Merci, j'adopte alors  ;D

Je vais faire mes tests pour voir comment cela fonctionne.

Merci beaucoup,

Cordialement.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Archimed78 le Octobre 31, 2012, 03:20:23 pm
J'ai donc testé le déplacement de la map avec les sf::View, au niveau des performances sa ne change pas au final, vu que a chaque fois on a besoin de redessiné toute la map, quand je parlai de conteneur, je parlai uniquement d'un ensemble de sprites que une fois chaque tiles chargé, ceci forme une "image" complète et il n'y a plus que a la déplacer. De plus avec ce type d'affichage je me retrouve avec des traits noir entre les tiles parfois, lors des déplacement.

Auriez-vous une astuce pour me dépatouiller ? ^^

Merci beaucoup,

Cordialement.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Laurent le Octobre 31, 2012, 03:40:23 pm
Citer
De plus avec ce type d'affichage je me retrouve avec des traits noir entre les tiles parfois, lors des déplacement.
C'est une conséquence des coordonnées non-entières. Du coup, si tu te débrouille pour que ta vue bouge toujours d'un nombre entier d'unités, ça devrait le faire.

Citer
quand je parlai de conteneur, je parlai uniquement d'un ensemble de sprites que une fois chaque tiles chargé, ceci forme une "image" complète et il n'y a plus que a la déplacer
Vertex array (SFML 2).
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Archimed78 le Octobre 31, 2012, 04:14:00 pm
Merci Laurent, effectivement sa parais plus que logique pour les coordonnées non-entières. Je vais rectifier ceci.

Et je vais faire mes tests sur ce que tu a dit, les Vertex array.

Merci beaucoup,

Cordialement.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Archimed78 le Octobre 31, 2012, 09:42:55 pm
J’avoue avoir du mal a comprendre comment on se sert des sf::VextexArray  :o

je vais continuer mes recherches.

Cordialement.

Edit : Plus j’essaie de comprendre et plus je me perd... Je ne comprend pas quel est le rapport entre les Vertex et mon problème de sprite  :-\
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Laurent le Octobre 31, 2012, 10:39:45 pm
Oui désolé, tant qu'il n'y a pas de tutoriel il est assez difficile d'expliquer les vertex arrays.

En fait un sprite est un vertex array figé (contenant 4 vertex, qui forment un quad). Le but c'est d'avoir ton propre vertex array qui contient tes 1200 sprites, formant ainsi une seule grosse entité manipulable comme un seul sprite.

Une autre manière d'aborder les vertex arrays, c'est de comprendre qu'ils sont le bas niveau de SFML. Tout le reste (Text, Shape, Sprite) est construit par dessus -- ils ont tous un vertex array en interne. Donc là tu vas construire ton propre type de drawable, avec son, propre vertex array.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Archimed78 le Octobre 31, 2012, 11:42:00 pm
Merci, je comprend mieux ! mais dans mon cas aurai-tu un petit code explicatif pour que puisse faire des tests, par ce que je ne trouve rien pour ajouter mes sprites dans le vertex array... ou bien j'ai encore rien compris  ;D Ce qui est fort probable.

Merci pour le temps que tu m'accorde en tout cas,

Cordialement.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Laurent le Novembre 01, 2012, 10:37:02 am
Le vertex array n'est qu'un tableau de sf::Vertex. Il n'y a pas de sprite ou autre, c'est une interface un peu plus bas niveau. Il faut définir tous les points (vertex) un à un, avec la bonne position, couleur et coordonnées de texture.

Il doit y avoir des exemples qui traînent sur le forum anglais.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Archimed78 le Novembre 02, 2012, 03:28:08 am
J'ai réussi a tout faire comme il faut (merci Laurent), sauf que la classe sf::VertexArray n'est pas composé de la méthode "move".

Dois-je a chaque fois supprimer tout le vertex pour le refaire ensuite avec un offset en x et y pour faire un déplacement ?

Je vous remercie chaleureusement de votre aide,

Cordialement.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Koryushin le Novembre 02, 2012, 07:39:44 am
Non, tu affiches ton sf::vertexarray avec sa texture, et ensuite tu n'as plus qu'à déplacer ta sf::view.
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Laurent le Novembre 02, 2012, 07:58:07 am
En fait si tu veux faire une vraie classe qui ressemble à sf::Sprite, tu peux faire comme ça :

class MyThing : public sf::Drawable, // pour pouvoir écrire window.draw(mything);
                public sf::Transformable // pour hériter des fonctions de transformation (move, rotate, scale)
{
public:

    ... tes trucs ...

private:

    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        states.transform *= getTransform();
        states.texture = &m_texture;
        window.draw(m_vertexArray, states);
    }

private:

    sf::VertexArray m_vertexArray;
    sf::Texture m_texture;
}

MyThing mything;
mything.setPosition(...);
window.draw(mything);
Titre: Re : [SFML2] Optimisation déplacement
Posté par: Archimed78 le Novembre 02, 2012, 02:05:49 pm
Super, je vous remercie pour tout, avec ceci je n'aurais plus de soucis.

Merci beaucoup a tous pour m'avoir aidé et du temps passé sur mon cas  ;D.

Cordialement.