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

Auteur Sujet: sprite.draw qui prend du temps  (Lu 3735 fois)

0 Membres et 1 Invité sur ce sujet

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
sprite.draw qui prend du temps
« le: Septembre 09, 2012, 01:39:52 am »
Hello
j'ai une carte divisée en 4x4 sf::RenderTexture

Selon la position de la caméra, je calcule quels sont les sf::RenderTexture qui ont besoin d'être affichés, et ensuite pour chacune d'entre elles, je calcule quelles tiles sont visibles, et puis je les dessine sur la bonne sf::RenderTexture (si elle n'ont pas encore été dessinées dessus). A la fin je ne dessine sur le target final que les sf::RenderTexture.
Du coup je remplis au fur et à mesure mon sf::RenderTexture avec les tiles de la carte.
Cependant j'ai un problème de perf quand je dessine pour la 1ere fois sur un sf::RenderTexture donné, ça me prend 300 ms alors que les autres affichages de tile prennent 1 ms.
Une idée d'où ça vient? Je vois que je passe dans ce cas par RenderTextureImplFBO::activate(true) mais je pige pas ce qui prend tout ce temps...

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #1 le: Septembre 10, 2012, 06:52:41 pm »
...personne?

G.

  • Hero Member
  • *****
  • Messages: 1470
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #2 le: Septembre 10, 2012, 09:27:46 pm »
Tu peux pas créer tes 4 RenderTexture à la création de la map ?

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #3 le: Septembre 12, 2012, 12:17:50 am »
Si elles sont créées à la création de la map, mais le "lag" de 300 ms apparait quand je dessine dessus la 1ere fois

minirop

  • Sr. Member
  • ****
  • Messages: 254
    • Voir le profil
    • http://dev.peyj.com
Re : sprite.draw qui prend du temps
« Réponse #4 le: Septembre 14, 2012, 06:38:17 am »
tu peux pas faire comme les autres jeux ? mettre un bel écran de loading ?

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #5 le: Septembre 14, 2012, 05:53:42 pm »
En fait ça se passe pas au loading mon pb
les sf::rendertexture de cache sont crées au chargement de l'appli (c'est instantanné)
C'est quand je fais le premier appel à Draw() avec un sprite sur ce sf::rendertexture que ça prend 300 ms, même pour un sprite de 2x2 pixels
après pour les autres draws sur le meme rendertexture ça me prend moins de 1 ms.
Tout le but de faire des rendertexture intermédiaires c'est de pouvoir dessiner tile par tile dessus au fur et à mesure que la caméra se déplace, donc si je charge tout au démarrage ça sert plus à rien!

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #6 le: Septembre 16, 2012, 05:59:46 pm »
Petit exemple qui reproduit le pb :
quand le curseur touche le carré au milieu pour la 1ere fois, j'ai un lag de 250 ms....
int main() {
       
        //initial sprite we want to draw
        sf::Texture sheet_to_draw;
        sf::Sprite sprite_to_draw;
        sprite_to_draw.setTexture(sheet_to_draw);
        sprite_to_draw.setPosition(100,100);

        //intermediate sf::RenderTexture
        sf::RenderTexture intermediate;
        sf::Sprite intermediate_sprite;
        intermediate.create(100,100);
        intermediate.clear(sf::Color(100,130,100));
        intermediate_sprite.setTexture(intermediate.getTexture());
        intermediate_sprite.setPosition(100,100);

        //main rendering window
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Graphics");
    clock_t start = clock();
        clock_t  end = clock();


        sf::FloatRect MainView(0, 0, 10, 10);
        sf::RectangleShape rectangleCamera(sf::Vector2f(10,10));
        rectangleCamera.setSize(sf::Vector2f(10,10));
        rectangleCamera.setOutlineThickness(1);
        rectangleCamera.setOutlineColor(sf::Color::Red);
        rectangleCamera.setFillColor(sf::Color::Transparent);


        while (App.isOpen())
    {

        // on inspecte tous les évènements de la fenêtre qui ont été émis depuis la précédente itération
        sf::Event event;
        while (window.pollEvent(event))
        {
            // évènement "fermeture demandée" : on ferme la fenêtre
            if (event.type == sf::Event::Closed)
                window.close();
        }

        App.clear(sf::Color(0,0,0));
                rectangleCamera.setPosition(sf::Mouse::getPosition(App).x-5,sf::Mouse::getPosition(App).y-5);
                MainView.left = sf::Mouse::getPosition(App).x-5;
                MainView.top = sf::Mouse::getPosition(App).y-5;


                //will lag when this condition is true:
                if(MainView.intersects(sf::FloatRect(100,100,100,100))) {
                        intermediate.draw(sprite_to_draw);
                        intermediate.display();
                }

                App.draw(intermediate_sprite);
                App.draw(rectangleCamera);
                end = clock();
                if( end-start > 5)
                        std::cout << (end-start)<<" ms \n";
                start = end;

       
                App.display(); 
    }

    return EXIT_SUCCESS;

};
« Modifié: Septembre 17, 2012, 03:28:06 pm par lezebulon »

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #7 le: Septembre 17, 2012, 02:42:26 pm »
hello...
personne pour executer le code plus haut et me dire si ils ont aussi un ralentissement?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : sprite.draw qui prend du temps
« Réponse #8 le: Septembre 17, 2012, 02:52:46 pm »
Il manque une boucle d'évènements dans ton code. Elle est nécessaire même si tu n'as pas besoin des évènements, car c'est l'appel à pollEvent qui permet à la fenêtre de traiter ses évènements internes.
Laurent Gomila - SFML developer

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #9 le: Septembre 17, 2012, 03:20:29 pm »
ok mais je ne pense pas que ça change le comportement de ce que j'ai posté non?
J'ai mis la boucle d'event sur le code que j'ai chez moi, je l'ai enlevé en postant pour alléger le tout

edit : j'ai édité le code avec la gestion des event
« Modifié: Septembre 17, 2012, 03:28:26 pm par lezebulon »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : sprite.draw qui prend du temps
« Réponse #10 le: Septembre 17, 2012, 03:35:16 pm »
Est-ce que tes pilotes graphiques sont à jour ? Quelle est ta carte graphique ?

Est-ce que ça change quelque chose si tu crées la render-texture après la fenêtre ?

Si tu fais un draw avant d'entrer dans la boucle principale, tout va bien c'est ça (à part pour ce draw là) ?

Et si tu fais un clear/display au lieu d'un draw/display dans ton test, ça lag aussi ?

Bref, faut pas hésiter à farfouiller et tester plein de trucs a priori pas pertinents. Ca permet d'avancer. Et puis parfois les pilotes graphiques sont tellement sensibles à des changements en apparence mineurs...
« Modifié: Septembre 17, 2012, 03:37:36 pm par Laurent »
Laurent Gomila - SFML developer

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : Re : sprite.draw qui prend du temps
« Réponse #11 le: Septembre 17, 2012, 10:21:51 pm »
>Est-ce que tes pilotes graphiques sont à jour ? Quelle est ta carte graphique ?
"Mobile Intel 4 Series Express Chipset Family" d'après le panneau de config. C'est un chipset intégré à la carte mère je pense, je suis sur un portable (c'est ptet juste ça le pb)

>Est-ce que ça change quelque chose si tu crées la render-texture après la fenêtre ?
Non, pareil

>Si tu fais un draw avant d'entrer dans la boucle principale, tout va bien c'est ça (à part pour ce draw là) ?
Là ça me prend 80 ms au lieu de 300 ms, c'est mieux mais ça me parait quand même relativement long pour ce que je fais

>Et si tu fais un clear/display au lieu d'un draw/display dans ton test, ça lag aussi ?
non là c'est instantané


Bref je pense que c'est ma CG qui gère mal l'open gl...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : sprite.draw qui prend du temps
« Réponse #12 le: Septembre 17, 2012, 10:24:23 pm »
Citer
Est-ce que tes pilotes graphiques sont à jour ?
Laurent Gomila - SFML developer

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #13 le: Septembre 17, 2012, 10:36:56 pm »
Oui je viens d'updater à l'instant, idem

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : sprite.draw qui prend du temps
« Réponse #14 le: Septembre 20, 2012, 09:41:58 pm »
je remonte le sujet une dernière fois...
j'imagine qu'il n'y a rien à faire à part avoir un PC moins pourri?

 

anything