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

Auteur Sujet: Ralentir l'utilisation du CPU  (Lu 4156 fois)

0 Membres et 1 Invité sur ce sujet

titouan

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Ralentir l'utilisation du CPU
« le: Octobre 19, 2013, 06:15:05 pm »
Bonjour à tous,

Voilà, quand je lance mon programme j'ai le CPU qui passé à 90%-100% ( comme beaucoup de gens ) et j'aimerais ralentir de manière efficace l'utilisation de ce dernier ( La V-SYNC est activé ca n'a pas d'effet, idem pour le setFramerate) Voici mon code si quelqu'un a une idée. ( j'aimerais éviter les sleep qui ralentissent le programme pour rien, en notant qu'un faible sleep n'a pas beaucoup d'effet, ca passe à 60%).
        bool graphDraw=false;
        while(window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                        {
                                window.close();
                                exit(1);
                        }
                        if (event.type == sf::Event::Resized)
                        {
                                animation.affichageBase(window);
                        }
                        window.handleEvent(event);
                }
                tgui::Callback callback;
                while (window.getCallback(callback))
                {
                    if (callback.callbackID == 1)
                    {
                        if (callback.trigger == tgui::Callback::mouseClick)
                        {
                            animation.affichageBase(window);
                            graph.display(pop,window);
                            window.display();
                            graphDraw=true;
                        }
                    }
                    else if (callback.callbackID == 2)
                                    {
                                        if (callback.trigger == tgui::Callback::mouseClick)
                                        {

                                            animation.affichageBase(window);
                                            graph.display(pop, window);
                                            window.display();
                                            graphDraw=true;
                                        }
                                    }
                }
        animation.affichageBase(window);
       if(!graphDraw)
                  window.drawGUI();
       else if(graphDraw)
           graph.display(pop, window);
                window.display();
        }

En vous remerciant !

Aeon

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Ralentir l'utilisation du CPU
« Réponse #1 le: Février 26, 2014, 06:50:08 pm »
Je remonte le thread car j'ai le même problème, que ce soit setVerticalSyncEnabled ou setFramerateLimit (en prenant bien soin de ne pas activer les deux bien sûr), ça ne fonctionne pas.

J'ai essayé d'autres solutions:
- std::this_thread::sleep_for ;
- condition dans la boucle principale ;
etc.
Rien ne change, le core alloué au thread est toujours occupé à 100% et j'ai un framerate qui explose.

J'ai regardé la conf de fglrx pour désactiver le vsync mais ça ne change rien (en même temps, je ne suis pas sûr que le VSync est bien été désactivé, la conf via aticonfig est vraiment galère), mais en même temps, bizarre que ça dépende de ça ( setFramerateLimit n'ajoute-t-il pas simplement un délai dans la boucle ?). La limitation du framerate avec la SDL fonctionne très bien avec SDL_Delay (l'occupation du core descend à moins de 1% et j'ai bien 60 FPS constant).

Si quelqu'un a une idée...

Ma conf:
- Linux 3.13.5 (x86-64)
- ATI Radeon R7 260X avec drivers Catalyst 14.1
- SFML 2.1

Aeon

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Ralentir l'utilisation du CPU
« Réponse #2 le: Février 27, 2014, 12:13:02 pm »
GLdouble angleMZ = 0;
GLdouble angleMX = 0;

int ExampleFramerateSFML_Mono()
{
    sf::ContextSettings settings(24, 8, 4, 3, 0);
    sf::RenderWindow* window = new sf::RenderWindow(sf::VideoMode(640, 480),"OpenGL Base", sf::Style::Default, settings);
    window->setFramerateLimit(60);

    glViewport(0, 0, window->getSize().x, window->getSize().y);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(70,(double)640/480,1,1000);
    glMatrixMode( GL_MODELVIEW );
    glEnable(GL_DEPTH_TEST);
    DrawCube(angleMX, angleMZ);
    sf::Clock clock;

    bool running = true;
    while (running)
    {

        sf::Event event;
        while (window->pollEvent(event))
        {
            switch(event.type)
            {
                case sf::Event::Closed:
                    running = false;
                    break;
            }
        }

        sf::Time elapsed = clock.restart();
        int elapsed_ms = elapsed.asMilliseconds();
        angleMZ += 0.05 * elapsed_ms;
        angleMX += 0.05 * elapsed_ms;
        DrawCube(angleMX, angleMZ);
        window->display();
    }

    window->close();

    delete window;

    return 0;
}
 

GLdouble angleTZ = 0;
GLdouble angleTX = 0;

void ThreadDrawingT(sf::RenderWindow* window)
{
    window->setActive(true);

    glViewport(0, 0, window->getSize().x, window->getSize().y);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(70,(double)640/480,1,1000);
    glMatrixMode( GL_MODELVIEW );
    glEnable(GL_DEPTH_TEST);
    DrawCube(angleTX, angleTZ);

    sf::Clock clock;
    while(window->isOpen())
    {
        sf::Time elapsed = clock.restart();
        int elapsed_ms = elapsed.asMilliseconds();
        angleTZ += 0.05 * elapsed_ms;
        angleTX += 0.05 * elapsed_ms;
        DrawCube(angleTX, angleTZ);
        window->display();
    }
}

int ExampleFramerateSFML_Multi()
{
    XInitThreads();

    sf::ContextSettings settings(24, 8, 4, 3, 0);
    sf::RenderWindow* window = new sf::RenderWindow(sf::VideoMode(640, 480),"OpenGL Base", sf::Style::Default, settings);
    window->setFramerateLimit(60);

    window->setActive(false);
    std::thread* thread = new std::thread(ThreadDrawingT, window);

    bool running = true;
    while (running)
    {

        sf::Event event;
        while (window->pollEvent(event))
        {
            switch(event.type)
            {
                case sf::Event::Closed:
                    running = false;
                    break;
            }
        }
    }

    window->close();

    thread->join();
    delete thread;
    delete window;

    return 0;
}
 
« Modifié: Février 27, 2014, 09:58:48 pm par Aeon »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Ralentir l'utilisation du CPU
« Réponse #3 le: Février 27, 2014, 12:37:38 pm »
Tu as tout ton code de dessin SFML dans la boucle d'évènements...
Laurent Gomila - SFML developer

Aeon

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Ralentir l'utilisation du CPU
« Réponse #4 le: Février 27, 2014, 02:03:35 pm »
Arf!! Quel con, c'est ça de faire des copier-coller à l'arrache. Bon du coup, ça marche beaucoup mieux, et j'ai plus d'occupation CPU trop importante. J'ai testé avec des threads, ça marche aussi très bien, du coup, faut que je vois ce qui cloche dans mon programme.

Aeon

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Ralentir l'utilisation du CPU
« Réponse #5 le: Février 27, 2014, 10:00:40 pm »
Laurant > J'ai mis à jour les 2 exemples que je voulais te montrer:
- le premier sans thread fonctionne très bien ;
- le second avec thread fonctionne mais occupe le CPU.
As tu une idée du problème ?

Merci d'avance.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Ralentir l'utilisation du CPU
« Réponse #6 le: Février 27, 2014, 11:07:54 pm »
Rien ne ralentit le thread principal, donc il fonctionne à 100% de CPU. Appelle getEvent plutôt que pollEvent et ça ira mieux.
Laurent Gomila - SFML developer

Aeon

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Ralentir l'utilisation du CPU
« Réponse #7 le: Février 28, 2014, 09:23:38 am »
Tu voulais dire waitEvent. Ca marche beaucoup mieux. Je viens de regarder, c'est en effet display qui appelle sleep, du coup, le thread principal est en roue libre. Peut-être le préciser dans le tuto sur les threads ?

En tout cas, merci Laurent, toujours très réactif.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Ralentir l'utilisation du CPU
« Réponse #8 le: Février 28, 2014, 09:53:39 am »
Citer
Tu voulais dire waitEvent
Oups, oui en effet.

Citer
Peut-être le préciser dans le tuto sur les threads ?
Je vais voir ça.
Laurent Gomila - SFML developer