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

Auteur Sujet: [Résolu] Performances draw  (Lu 2069 fois)

0 Membres et 1 Invité sur ce sujet

Lasconik

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
[Résolu] Performances draw
« le: Juin 12, 2013, 03:43:38 pm »
Bonjour,
j'avais déjà utilisé la sfml 1.6 auparavant, mais avec la nouvelle version et l'apparition des Textures, je me pose des questions !

Je cherche à un faire un truc plutôt simple : dessiner une map selon un tableau d'entiers. Ces entiers sont des indices disant où chercher la tile dans le tileset.
Il y a deux façons de faire assez différentes.

Citer
Les puces et les APIs graphiques modernes sont vraiment faites pour des cycles clear/draw/display répétés, où tout est complètement rafraîchi à chaque itération de la boucle de dessin. Ne soyez pas effrayés de dessiner 1000 sprites 60 fois par seconde, vous êtes encore loin des millions de triangles que votre machine peut gérer.

Option 1 --> très classique, on dessine (largeur*hauteur) tiles.
Ainsi pour une map de 20x20 avec des tiles de 32 pixels, on appelle 400 fois draw pour des affichages de 1024 pixels.
__________
MAIS
__________
Citer
Par exemple, vous atteindrez très rapidement les limites de votre carte graphique si vous dessinez un grand nombre de sprites. La raison est la suivante : les performances sont directement liées au nombre d'appels à la fonction draw.
Citer
De plus, utiliser une unique texture vous permettra si nécessaire de regrouper toute la géometrie statique en une seule entité (vous ne pouvez en effet utiliser qu'une seule texture par appel à la fonction draw), ce qui sera nettement plus performant que de dessiner un groupe de plusieurs entités.

Option 2 --> Créer une grosse texture (par exemple au chargement de la map) qui contiendra en fait toutes les tiles, en copiant les pixels uns par uns).
Ainsi pour la même map on fait 1 seul appel à draw, pour environ 410000 pixels. Et la gestion de la vue est plus facile.


Donc, qu'est-ce qui est le mieux ?
La première option fait plus d'appels à draw, mais sur des images plus petites.
La seconde ne fait qu'un appel, mais on dessine des chose hors-écran, c'est du gachis. EN plus j'ai vu sur le forum que les textures avaient une taille limite.

Sur une map de 20*20 je ne pense pas que ce soit significatif, mais sur une map de 500*500, le nombre d'appels à draw explose dans le cas 1, et la taille dans le cas 2 devient énorme.

(Une solution intermédiaire consiste à mixer les deux : faire une seule image, contenant uniquement ce qu'on peut voir, et la recalculer à chaque déplacement du personnage. )

Merci d'avance pour vos réponses et éclaircissements ! :)
« Modifié: Juin 15, 2013, 01:58:52 pm par Lasconik »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Performances draw
« Réponse #1 le: Juin 12, 2013, 03:54:48 pm »
Solution 3 : utiliser un vertex array. Un seul appel à draw, aucune limite de taille. Par contre tu dessineras toujours des choses hors écran ; si ça te gêne (mais j'ai tendance à penser que ce ne sera pas le cas) tu peux toujours trouver un compromis en découpant ta carte en gros "chunks" : ça te donnera quelques appels à draw, et peu de dessin hors écran (selon la taille des chunks évidemment).

D'ailleurs le second passage que tu cites fais plutôt référence au vertex array qu'au pré-rendu dans une grosse texture, si je ne m'abuse.
Laurent Gomila - SFML developer

Lasconik

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : Performances draw
« Réponse #2 le: Juin 13, 2013, 12:13:00 pm »
Citer
D'ailleurs le second passage que tu cites fais plutôt référence au vertex array qu'au pré-rendu dans une grosse texture, si je ne m'abuse.

Tout à fait. Je vais donc me pencher vers ça. Merci d'une réponse si rapide !
Mais juste par curiosité, qu'est-ce qui aurait été le plus performant : plein de petits draw, ou 1 seul gros ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Performances draw
« Réponse #3 le: Juin 13, 2013, 12:19:04 pm »
Citer
qu'est-ce qui aurait été le plus performant : plein de petits draw, ou 1 seul gros ?
Je crois que c'est clair non ? :P

Citer
les performances sont directement liées au nombre d'appels à la fonction draw.

La taille de l'entité on s'en fiche un peu, le coût du nombre de pixels à dessiner est très très très inférieur à celui de la fonction draw, et de bien d'autres considérations.
Laurent Gomila - SFML developer