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

Auteur Sujet: Particules sur l'écran / Fusion SFML - SDL  (Lu 7382 fois)

0 Membres et 1 Invité sur ce sujet

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Particules sur l'écran / Fusion SFML - SDL
« le: Décembre 23, 2012, 05:27:35 pm »
Bonjour,
J'ouvre ce sujet pour savoir 2 choses a propos du module graphique de la SFML (2.0).

Déjà: Existe t-il un moyen de dessiner directement des pixels sur l'écran (sans passer par sf::Image → sf::Texture → draw()).
De façon relativement simple si possible, si il faut utiliser directement OpenGL par exemple je ne saurais pas comment faire.

Je pose cette question car je me suis crée un moteur de particules, il tourne très bien, mais a un défaut majeur: La zone de rendu.
Vu qu'il dépose les particules comme pixels sur une sf::Image qu'il convertit et affiche ensuite, il faut que la zone de rendu soit assez petite, exemple, une zone de rendu de 800*600 ça passe plutôt bien, même avec 100000 particules, en revanche une zone de rendu de 1920*1080 ça fait ramer le jeu même avec 0 particules, parce que le moteur de particules doit s'amuser à effacer l'image (ou supprimer une puis la recréer) d'une grande taille et ensuite y poser les particules, la convertir en sf::Texture et enfin l'afficher.
Bref, chute de perfs assurée, si il existe une fonction pour dessiner directement sur la fenêtre je suis preneur.


Ensuite, est t-il possible de fusionner SFML et SDL, les 2 bibliothèques utilisant OpenGL ça serait intéressant.
J'apprends en ce moment a utiliser la SDL en plus de la SFML, et je constate 2 choses:
- La SDL est plus difficile a utiliser que la SFML (du moins a prendre en main)
- La SDL propose par contre des choses plus précise et de plus bas niveau (exemple, la selection entre la mémoire RAM et la mémoire graphique)

Je pense donc que les 2 bibliothèques peuvent se compléter l'une et l'autre, et par exemple je sais déjà que la SDL propose de dessiner directement des pixels sur l'écran, d'où l'idée de la fusionner à la SFML.

Voilà, j'ai peut être pas la bonne solution à mon problème, donc un peu d'aide serait avec joie :)
Merci :)

PS: J'apprends à utiliser la SDL en C++ afin de profiter des std::string et tout le C++, malgré que la SDL soit codée en C.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #1 le: Décembre 23, 2012, 05:33:44 pm »
Pour dessiner des points sur l'écran directement, tu peux passer par des sf::Vertex dessinés en tant que primitive de type sf::Points. Y a pas encore de tuto alors n'hésite pas à demander si tu veux un exemple.

SDL et SFML ne sont pas complémentaires. Ce que tu penses être "cool" dans SDL ce sont des trucs préhistoriques :
- ils peuvent dessiner directement sur l'écran car le rendu est software, ils n'utilisent pas OpenGL et l'accélération matérielle
- ils doivent choisir entre RAM système et graphique pour les surfaces car ça fait une différence pour le rendu software, mais de nos jours si tu utilises l'accélération graphique c'est une question qui ne se pose plus
Laurent Gomila - SFML developer

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #2 le: Décembre 23, 2012, 06:54:31 pm »
OK, je suis encore bien loin de tout savoir sur les différences entre ces bibliothèques, donc on oublie la fusion.

SDL: Pour utiliser la SDL, et notamment faire un truc de présentation dont j'ai absolument besoin et que je peux pas faire avec la SFML a cause des ****** de pilotes ATI, ou faire des jeux 100% en C (en fait pour les jeux 100% en C la SFML le peut aussi...)

SFML: Pour mon utilisation actuelle bien sûr, et profiter de l'accélération matérielle pour le rendu.


En fait vu que la SDL utilise un rendu logiciel et a priori n'utilise pas l'accélération matérielle de la même façon que la SFML, c'est probablement pour ça quelle n'est pas affectée par les problèmes de cartes ATI. (Pour le coup je confirme, le pb ne viens pas de la SFML pour les sf::ConvexShape, ça viens bien des pilotes ATI pour Linux qui sont bâclés)
Bref.

Donc, pour la solution: Merci pour ta réponse rapide.
Je ne savais en effet pas que la SFML proposait ça, c'est une (très) bonne chose :)

Donc, je crée un sf::Vertex, je change sa position, et sa couleur et je l'affiche?
C'est donc aussi simple que ça? :D


Au fait, j'ai vu l'exemple de la doc: En fait un sf::ConvexShape est un assemblage haut niveau de plusieurs sf::Vertex si j'ai bien compris?
Merci :)

PS: Juste une question HS: Le bug des carrés autour des lettres sur les sf::Text est-il corrigé sur la version nightly?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #3 le: Décembre 23, 2012, 08:42:08 pm »
Citer
Donc, je crée un sf::Vertex, je change sa position, et sa couleur et je l'affiche?
Oui, enfin tu en auras sûrement plus d'un. Normalement toutes tes particules seront dans un gros tableau de sf::Vertex (voire directement un sf::VertexArray), que tu dessineras en un appel à draw.

Citer
Au fait, j'ai vu l'exemple de la doc: En fait un sf::ConvexShape est un assemblage haut niveau de plusieurs sf::Vertex si j'ai bien compris?
Oui, les vertex (assemblés en primitives) sont les briques de base du rendu. Tout est basé là-dessus.

Citer
Le bug des carrés autour des lettres sur les sf::Text est-il corrigé sur la version nightly?
Oui.
Laurent Gomila - SFML developer

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #4 le: Décembre 23, 2012, 09:05:47 pm »
OK, en fait j'ai déjà un tableau avec mes propres particules ( SMG::Particules ) qui contient d'autres informations importantes sur les particules (position, trajectoire, couleur, couleur de base, couleur d'arrivée, temps de vie, etc..)

En fait pour gagner du temps, je pense créer un sf::Vertex en dehors de ma boucle, et le déplacer et le draw pour chaque particule.
ça sera beaucoup plus rapide que d'en allouer un nouveau a chaque fois, ou que d'utiliser un sf::Image.


Et OK, donc je vais voir pour prendre la version Nightly (comme ça je passe tout mon projet sur cette version) ça me corrigera ces bugs très très moches :p
Merci :)

PS: Seul ennui de la version Nightly: les sf::Text n'ont pas de police par défaut, donc même si j'en ai une pour mon jeu, je dois du coup modifier tous les constructeurs des sf::Text sur 28000lignes de codes :D
Enfin, de toutes façon faut bien le faire un jour ;)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #5 le: Décembre 23, 2012, 09:13:34 pm »
Citer
En fait pour gagner du temps, je pense créer un sf::Vertex en dehors de ma boucle, et le déplacer et le draw pour chaque particule.
ça sera beaucoup plus rapide que d'en allouer un nouveau a chaque fois, ou que d'utiliser un sf::Image.
Tu prends les choses dans le mauvais sens. Avec une telle façon de penser, tu vas droit dans le mur :P

Ce qui fait qu'une application graphique (utilisant l'accélération matérielle) va être performante, c'est sa capacité à envoyer beaucoup de boulot à la carte graphique en un coup. Donc, dessiner des vertex un à un c'est totalement à l'opposé de ce qu'il faut faire. Ta carte graphique va te haïr si tu essaye de faire ça.

Le but c'est de fourrer tous tes vertex dans un gros tableau, et de l'envoyer en un appel à ta carte graphique. Là tout le monde sera content.

Tu dis "ça sera beaucoup plus rapide que d'en allouer un nouveau a chaque fois", mais ce genre de considération est à des années-lumières des problématiques réelles qui font qu'une application graphique va tourner vite ou non. Mais bon, ça tu l'apprendras avec l'expérience :)
Laurent Gomila - SFML developer

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #6 le: Décembre 23, 2012, 09:29:09 pm »
Donc en (très) gros:
Il faut que je mette tout les sf::Vertex dans un sf::VertexArray et que j'envoie le tout d'un seul coup avec un draw?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #7 le: Décembre 23, 2012, 11:03:47 pm »
Je pense que la réponse est clairement "oui" ;D

Citer
Normalement toutes tes particules seront dans un gros tableau de sf::Vertex (voire directement un sf::VertexArray), que tu dessineras en un appel à draw.
Citer
Le but c'est de fourrer tous tes vertex dans un gros tableau, et de l'envoyer en un appel à ta carte graphique.
Laurent Gomila - SFML developer

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #8 le: Décembre 23, 2012, 11:10:10 pm »
OK, je vais essayer ça :)
Merci :D

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #9 le: Janvier 15, 2013, 04:55:08 pm »
Bonjour,
J'avais pas donné de nouvelle, mais effectivement ça fonctionne extrêmement bien !

J'ai une autre question pour optimiser:
Y a t-il moyen de mettre pleins de sf::Sprite dans un sf::VertexArray?

Exemple, j'ai une grosse map a afficher dans mon jeu, et plutôt que d'afficher les cases une par une (32*32 pixels) en sachant qu'il y en a un bon nombre, est-ce possible de mettre tous les sf::Sprite dans un sf::VertexArray et tout afficher d'un coup?
Merci :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #10 le: Janvier 15, 2013, 05:37:13 pm »
Bien sûr que c'est possible. Il suffit de transformer tes sprites en sf::Vertex[4].
Laurent Gomila - SFML developer

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #11 le: Janvier 15, 2013, 06:44:41 pm »
Euh, comment je fais pour transformer mes sprites tout en gardant l'echelle, l'orientation etc...?
Y a une fonction déjà prête pour ça?
Merci :)

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #12 le: Janvier 15, 2013, 06:46:33 pm »
C'est possible d'utiliser un sf::Transformable sans altérer le sprite?
Si par exemple je veux convertir des sf::ConvexShape et des sf::Sprite?
Merci :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #13 le: Janvier 15, 2013, 08:14:46 pm »
Citer
Euh, comment je fais pour transformer mes sprites tout en gardant l'echelle, l'orientation etc...?
Tu te débrouilles ;)
Ce serait peut-être plus simple de gérer directement des sf::Vertex avec une transformation, plutôt que d'essayer de "convertir" des sprites.
Sinon, si tu tiens absolument à faire ça, prends les 4 coins du textureRect et transforme les avec sprite.getTransform().transformPoint(p).

Citer
C'est possible d'utiliser un sf::Transformable sans altérer le sprite?
Si par exemple je veux convertir des sf::ConvexShape et des sf::Sprite?
J'ai pas compris ce que tu voulais faire là.
Laurent Gomila - SFML developer

Crone123

  • Full Member
  • ***
  • Messages: 141
    • Voir le profil
Re : Particules sur l'écran / Fusion SFML - SDL
« Réponse #14 le: Janvier 15, 2013, 08:32:48 pm »
Y a pas moyen d'obtenir tous les sf::Vertex d'un objet, exemple sf::Sprite ou sf::ConvexShape?
En fait, une fois que j'ai récupéré les sf::Vertex c'est bon, le seul problème est de les obtenir....
Merci :)