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

Auteur Sujet: SFML est lente sur de gros projets.  (Lu 5285 fois)

0 Membres et 1 Invité sur ce sujet

nagimar

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
SFML est lente sur de gros projets.
« le: Juillet 15, 2021, 12:59:55 pm »
Salut, j'ai commencé à utiliser la SFML il y a bien longtemps et mon projet s'agrandissant, je me suis rendu compte que la SFML est lente et on m'a clairement dit que la SFML n'était pas une référence pour faire de gros projets avec opengl.

Les appels à glDraw sont lents surtout lorsqu'on utilise pas mal de textures de rendu, SFML n'utilises aucune technique moderne, que ça soit les buffers (UBO,  bindless textures, etc...), j'ai donc tenté de changer les classes de la SFML pour faire tout ça, mais ça reste lent, à cause des appels à glDraw à chaque rendertexture, j'ai pensé à utiliser des threads pour faire plusieurs appels à draw simultanément en espérant que ça n'altère pas le rendu final (normalement non car c'est opengl qui se charge de faire la synchronisation au niveau de la mise à jour de l'affichage) et que je n'aie pas trop de crash à cause des accès concurrents, on m'a même carrément conseillé d'utiliser VULKAN plutôt qu'opengl pour faire du multithreading, cependant, SFML ne possède actuellement pas d'implémentation pour VULKAN, je n'en ai pas trouver du moins.

Mais il n'y a pas que ça, j'ai remarqué que plus le CPU est lent à l'exécution, plus le GPU l'est aussi, j'ai remarqué que les fonctions virtuelles (SFML en utilise) sont lentes sur de plus gros projets, parce que, la recherche de la bonne fonction à appeler se fait à l'exécution et non pas en compilation.

J'ai pensé alors à un système de type ECS qui utilise la composition plutôt que l'héritage cependant cela est lourd pour gérer des noeuds (Récupérer les composants de tout les noeuds enfants et calculer la transformation finale) comme c'est illustré dans l'exemple de l'un des tutoriels de la SFML d'ailleurs.

J'ai donc pensé aux nouvelles fonctionnalités du c++ moderne c'est à dire aux templates variadiques et au polymorphisme d'inclusion qui est beaucoup plus rapide d'après mes tests (Malgré le fait qu'il faille rechercher le bon type dérivé à l'exécution mais je le fait à coup de "if" générés en compilation ce qui est rapide) et j'ai implémenté cette solution.

Pourquoi la SFML, n'utilise t'elle pas des fonctionnalités du c++ moderne ? (Et il n'y a pas que la SFML, beaucoup d'ancienne bibliothèque ne le font pas)
Est ce que cela va changer à l'avenir ?

Je pense que si les nouvelles technologies existent, c'est pour certaines raisons, des questions de performance la plupart du temps.


 

nagimar

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re: SFML est lente sur de gros projets.
« Réponse #1 le: Juillet 17, 2021, 10:26:42 am »
Les pertes de performances j'ai remarqué se font surtout au niveau du draw.

Le polymorphisme d'inclusion est plus rapide que les virtuels, sauf dans le cas ou j'ai une structure arborescente! Et ce, même si j'ai une dizaine de fonctions virtuelles et une dizaines de types, il faut juste utiliser plusieurs interfaces pour ne pas avoir 100 types qui redéfinissent 100 méthodes virtuelles.

Mais je pense que pour des classes du genre RenderTarget qui on n'est sûr, ne seront pas des structures arborescentes, utiliser le polymorphisme d'inclusion est plus performant, ce qui n'est pas le cas pour Drawable et Transformable par exemple.

Par contre, un système du style ECS est plus lent, j'ai remarqué.

nagimar

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re: SFML est lente sur de gros projets.
« Réponse #2 le: Juillet 23, 2021, 09:58:21 pm »
Bon, j'ai trouvé ou ça coince au niveau des performances, c'était en effet, les fonctions virtuelles, et l'héritage que j'utilisais à mauvais escient même avec le polymorphisme d'inclusion.

On peut voir ici qu'il y a une large différence de performance entre un système SFML-Like et un système ECS comme Unity que je vais utiliser dans mon framework d'ailleurs :

https://quick-bench.com/q/jEGRWG62s39A0OzY22E-iNtuvWo