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

Auteur Sujet: [résolu] [RenderTexture] méthode create lente  (Lu 3941 fois)

0 Membres et 1 Invité sur ce sujet

Assouan

  • Newbie
  • *
  • Messages: 22
  • texe perso
    • Voir le profil
    • E-mail
[résolu] [RenderTexture] méthode create lente
« le: Février 19, 2013, 10:58:52 am »
Salut, j'ai un élément graphique qui contient d'autre élément graphique
On peut résumer ce-ci, par ce-ci :

// Fonction d'initialisation
sf::RenderTexture rendertexture;
sf::Sprite sprite;

// Fonction de refresh (taille)
rendertexture.create(geometry.width, geometry.height);
sprite.setTexture(rendertexture.getTexture(), true);
ps: j'ai tapé le code à la main (des erreurs sont possible)

Le problème, est que l'appel de create est vraiment lourd... alors que celui de image/texture est léger

Donc, je voudrais vous demander, qu'elle solution me conseiller vous ?

Utiliser GLEW me rendra t'il create plus rapide ?
Créer des rendertexture de grande taille et jouer avec sf::View ?
Utiliser Image/Texture (au risque d'avoir mon propre draw faible et lent? par ce que franchement, je doute que passer par des getPixel/setPixel soit une bonne idée... sauf pour tuer mon processeur =D) ?
« Modifié: Février 19, 2013, 04:56:04 pm par Assouan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #1 le: Février 19, 2013, 02:27:44 pm »
Déjà, pourquoi recrées-tu la render-texture aussi souvent ? Imaginons que tu ne le fasses que lorsque la taille a changé (c'est vraiment trop lent dans ce cas ?), tu peux créer la texture avec une taille max et ensuite seulement jouer sur le textureRect du sprite pour n'en prendre qu'une partie.
Laurent Gomila - SFML developer

Assouan

  • Newbie
  • *
  • Messages: 22
  • texe perso
    • Voir le profil
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #2 le: Février 19, 2013, 03:09:22 pm »
Quand j'ai dit refresh, je voulais parler du changement de taille
Sinon pour te répondre, oui c'est vraiment trop lent dans ce cas (j'arrive à constaté à l'oeil nu le temps que ça prend pour se redimensionner)
Dans mon exemple d'utilisation, c'est dans un cas ou un Window extensible contient un layout extensible, qui lui même contient plain de sous layout extensible et ...

Du coup, quand on s'amuse à redimensionner le Window à la souris, on remarque la lenteur de create =s

Voici un exemple, qui me donne comme résultat :

int main()
{
    std::cout << "sf::RenderTexture test... ";

    sf::RenderTexture rts[16];

    sf::Clock clock;

    for(sf::RenderTexture& rt : rts)
    {
        rt.create(100, 25);
    }

    sf::Int32 time = clock.getElapsedTime().asMilliseconds();

    std::cout << time << " milliseconds" << std::endl;
}
sf::RenderTexture test... 1144 milliseconds

Ce qui fait, quand même une bonne seconde ^^
Et je ne crois pas que c'est mon pc qui foire, vu que je n'ai encore eu aucun soucis avec sf::Image, sf::Texture, draw() et ...

Si vous pouviez faire des testes de vos cotés (au cas où) ça serait bien.

Sinon je vais faire comme tu me le conseille Laurent (créer une taille de base, puis doublé celle-ci s'il faut plus et ainsi de suite)

Edit: Laurent, aurais-tu une idée pourquoi cette fonction est si lourde ? Et une petite explication à ce sujet en même temps. (cela doit surement venir de GlContext::create())
« Modifié: Février 19, 2013, 03:22:27 pm par Assouan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #3 le: Février 19, 2013, 03:24:47 pm »
C'est lourd parce que ça crée un contexte OpenGL, tout simplement.

Ca me paraît assez lourd comme architecture, d'avoir plein de render-texture qui peuvent être redimensionnées. Tu en as besoin pour quoi ? Est-ce que tu as essayé de trouver des alternatives ?
Laurent Gomila - SFML developer

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : [RenderTexture] méthode create lente
« Réponse #4 le: Février 19, 2013, 03:39:59 pm »
Sinon t'en crées qu'une seule que tu updates, et changes le textureRect du sprite quand tu "redimensionnes" ?

edit: oops en effet, j'ai dû sauter un message  :-[
« Modifié: Février 19, 2013, 11:06:21 pm par G. »

Assouan

  • Newbie
  • *
  • Messages: 22
  • texe perso
    • Voir le profil
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #5 le: Février 19, 2013, 03:51:33 pm »
Args, je ne savais pas que les Context était lourd à créer =s

Enfaîte, c'est simplement pour des Widget conteneur, (ex: ScrollArea, Window, Layout, ...)
Donc quand un enfant est modifier, je clear puis draw tous les enfants et display...
Donc au final, on n'affiche que le Widget conteneur, au lieu d'afficher ses enfants par dessus (ce qui est un sacré gain rentable)

J'ai pensé à créer un sf::Image au lieu de sf::RenderTexture, mais les get/setPixel, je pense que ça peut être lourd

Edit:
@G.: Oui, c'est ce que m'avait proposer Laurent
« Modifié: Février 19, 2013, 03:54:58 pm par Assouan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #6 le: Février 19, 2013, 03:54:13 pm »
Citer
ce qui est un sacré gain rentable
Apparemment pas tant que ça... as-tu réellement mesuré les performances avec l'approche "naïve" ?

Citer
J'ai pensé à créer un sf::Image au lieu de sf::RenderTexture, mais les get/setPixel, je pense que ça peut être lourd
Oublie ça tout de suite.
Laurent Gomila - SFML developer

Assouan

  • Newbie
  • *
  • Messages: 22
  • texe perso
    • Voir le profil
    • E-mail
Re : Re : [RenderTexture] méthode create lente
« Réponse #7 le: Février 19, 2013, 04:02:19 pm »
Citer
ce qui est un sacré gain rentable
Apparemment pas tant que ça... as-tu réellement mesuré les performances avec l'approche "naïve" ?
Disons, que j'ai pas vraiment mesuré les performances mais simplement, réfléchie par logique...
Afficher une texture de 600*500 (la texture qui contient le conteneur et les enfants)
C'est bien plus rentable, que d'afficher une texture de 600*500 (celle du conteneur) puis les divers textures des enfants

Mais sinon, que penses-tu de l'idée de procéder avec une sorte de cache-mémoire
En résumer, si le cache est à jour, on se contente d'afficher simplement l'image du cache
Sinon, s'il est pas à jour, on affiche le conteneur et les enfants
Et un petit thread qui s'occupe de mettre à jour le cache, (ex: si le cache du Conteneur n'est pas à jour et n'a pas été modifier depuis 2sec, hop on calcule et on crée le nouveau cache)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #8 le: Février 19, 2013, 04:18:13 pm »
Des threads, des caches, des buffers, ... tu te compliques la vie pour potentiellement pas grand chose. L'optimisation prématurée, basée sur la "logique", ça mène parfois droit dans le mur. N'oublie pas que ta carte graphique est parfaitement à l'aise avec des centaines de millions de triangles par seconde, alors tes quelques petits widgets (bien que leur rendu via SFML ne soit pas très optimisé), elle en rigole.

Là tu es en train de plancher sur des choses compliquées juste pour potentiellement optimiser ton truc, et du coup tu n'avances même pas sur le truc en lui-même. La phase d'optimisation, c'est normalement à la fin.
Laurent Gomila - SFML developer

Assouan

  • Newbie
  • *
  • Messages: 22
  • texe perso
    • Voir le profil
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #9 le: Février 19, 2013, 04:37:12 pm »
C'est que, passe de 1500 fps à 2/3 fps, pour un petit redimensionnement à la souris, ça fait peur...

Mais bon, tu as raison... Je vais laisser ça de coté pour plus tard... ;D

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #10 le: Février 19, 2013, 04:46:39 pm »
Ne laisse pas ça de côté, vire les render-textures ;)
Laurent Gomila - SFML developer

Assouan

  • Newbie
  • *
  • Messages: 22
  • texe perso
    • Voir le profil
    • E-mail
Re : [RenderTexture] méthode create lente
« Réponse #11 le: Février 19, 2013, 04:52:04 pm »
Ok, je vais faire ça alors