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

Auteur Sujet: Une question sur le draw()  (Lu 2255 fois)

0 Membres et 1 Invité sur ce sujet

djentx

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Une question sur le draw()
« le: Avril 07, 2015, 03:37:17 am »
Bonjour,

dans le tutoriel, il est dit qu'il vaut mieux dessiner un gros tableau de verticle portant sur une texture que des tas de sprites (à cause des changements de texture et d’états qui prennent du temps).

Quand je regarde dans le code source je constate que si je veux dessiner un sf::Sprite
void RenderTarget::draw(const Drawable& drawable, const RenderStates& states)
appelle
void Sprite::draw(RenderTarget& target, RenderStates states) const
qui lui même appelle
void RenderTarget::draw(const Vertex* vertices, unsigned int vertexCount,
                        PrimitiveType type, const RenderStates& states)
qui est justement la fonction à appeller pour dessiner des tableaux de vertex.

Or dans cette fonction, je trouve
if (textureId != m_cache.lastTextureId)
            applyTexture(states.texture);
qui me laisse entrevoir que SFML verifie d'abord s'il y a un changement de texture entre deux appel de draw() avant de changer de texture dans openGL.

Donc ma question:
Si je dessine des sprites en rafale mais que tous ces sprites pointent sur une même texture, cela reste-il déconseillé ?

Merci d'avance, et bonne journée.

victorlevasseur

  • Full Member
  • ***
  • Messages: 206
    • Voir le profil
Re : Une question sur le draw()
« Réponse #1 le: Avril 07, 2015, 07:07:23 am »
Salut,

Ce sera toujours moins lourd que différents sprites avec différentes textures. Par contre, il y aura toujours plein d'appels à draw. Mais tu devrais quand même avoir des performances convenables.  ;)

djentx

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Une question sur le draw()
« Réponse #2 le: Avril 07, 2015, 01:27:39 pm »
Merci beaucoup.

djentx

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Une question sur le draw()
« Réponse #3 le: Avril 07, 2015, 04:06:38 pm »
Dans mon projet, je suis parti, sur uns solution de "sprites personnalisés" qui n'héritent que de sf::Transformable.

Au final, un affichage de la scène ne consiste qu'a stocker tous les sf::Vertex (transformés si besoin) de tous les éléments de la scène, dans un tableau, et dessiner le tout en un seul appel a draw() portant sur une seule texture qui contient tout ce dont j'ai besoin.

Est-ce une bonne solution, ou c'est un peu trop exagéré ?

Merci.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Une question sur le draw()
« Réponse #4 le: Avril 07, 2015, 04:16:01 pm »
Citer
Est-ce une bonne solution
A toi de nous le dire, c'est toi qui l'a implémenté ;)
Laurent Gomila - SFML developer

Glân de Brylan

  • Invité
Re : Une question sur le draw()
« Réponse #5 le: Avril 09, 2015, 11:59:27 am »
S'il n'y a qu'un seul appel à draw(), je dirais que tes performances d'affichage sont optimales, et dit comme ça, ça a l'air relativement facile à gérer. Par contre au niveau opération en mémoire, aie aie aie...recréer un tableau assez énorme à chaque dessin, ta RAM va pas aimer. Pour le coup c'est peut-être là que ça va pêcher.

Il n'y a pas 40 façons de vérifier ça : utilise ta méthode, vois les FPS, puis utilise la méthode de base avec plein de sf::Sprite pour dessiner exactement la même scène, et vois les FPS. Compare les deux. La méthode qui donne le plus de FPS est la meilleure.
Perso j'utilise une méthode similaire mais de manière locale, par exemple si j'ai un gros boss constitué de plein de sprites pour des animations de ouf je crée une classe personnalisée qui gère tous les sprites en un seul tableau de vertex, ça donne de bons résultats et sans grosses opérations en mémoire.