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

Auteur Sujet: Le processeur tourne à fond  (Lu 3991 fois)

0 Membres et 1 Invité sur ce sujet

Phounet

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Le processeur tourne à fond
« le: Septembre 06, 2015, 04:43:31 pm »
Bonjour tout le monde,

Pourriez-vous svp m'aider à solutionner le problème suivant:

Je suis au début de la création d'un petit casse-brique (je débute en programmation). Pour l'instant, j'ai une fenêtre, une balle, et une barre qui se déplace. Autant dire qu'il n'y a pas grand chose.

Le souci est que lorsque je compile le programme pour le tester, le processeur se met à tourner à fond. Le premier coeur est utilisé à 100%, ce qui génère pas mal de bruit et vide la batterie du laptop.

Du coup, je souhaite connaître la manière la plus propre de réduire l'utilisation du processeur sans altérer la fluidité du programme.

Pour info, j'ai essayé sf::sleep() et window.setFramerateLimit() [sans FPS limit, le "jeu" tourne à plus de 2000 FPS, d'où l'utilisation extrême du processeur].

Ces deux solutions ne me donnent pas satisfaction car les déplacements de la barre ne sont plus fluides (même lorsque le FPS est limité à 100, ce qui devait en principe être suffisant pour avoir un mouvement fluide). Etant à court de solution, je fais appel à vous.

Merci d'avance à tous,

Phounet

Main.cpp

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <iostream>
#include <cstdlib>
#include "Moteur.h"

using namespace std;
using namespace sf;

int main()
{
    Moteur moteur;
    FenPrincipale window;
    Balle balle(window);
    Barre barre(window);

    moteur.setPositionBarre(window, barre);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
        }

        moteur.deplacerBarre(window, barre);

        window.clear();
        window.draw(balle);
        window.draw(barre);
        window.display();

    }

    return 0;
}
 

Moteur.h

#ifndef MOTEUR_H_INCLUDED
#define MOTEUR_H_INCLUDED

#include <SFML/Graphics.hpp>
#include <iostream>
#include "FenPrincipale.h"
#include "Balle.h"
#include "Barre.h"

class Moteur
{
    public:

    Moteur();
    ~Moteur();

    void restartHorlogeBarre();
    void setPositionBarre(FenPrincipale&, Barre&);
    void deplacerBarre(FenPrincipale&, Barre&);

    private:

    sf::Time m_tempsBarre;
    sf::Clock m_horlogeBarre;
};

#endif // MOTEUR_H_INCLUDED
 

Moteur.cpp

#include "Moteur.h"

using namespace std;
using namespace sf;

Moteur::Moteur()
{
    cout << "Construction du moteur." << endl;
}

Moteur::~Moteur()
{
    cout << "Destruction du moteur." << endl;
}

void Moteur::restartHorlogeBarre()
{
    m_horlogeBarre.restart().asSeconds();
}

void Moteur::setPositionBarre(FenPrincipale& window, Barre& barre)
{
    barre.setPosition(window.getLargeur()/2 - barre.getLargeur(), window.getHauteur() - barre.getHauteur());
}

void Moteur::deplacerBarre(FenPrincipale& window, Barre& barre)
{
    float vitesseBarre = barre.getVitesse();
    float largeurBarre = barre.getLargeur();
    float barrePosY = barre.getPositionY();
    float largeurFenetre = window.getLargeur();

    m_tempsBarre = m_horlogeBarre.restart();

    if(Keyboard::isKeyPressed(Keyboard::Left))
    {
        if(barre.getPosition().x > 0)
        {
            barre.move(Vector2f(-vitesseBarre * m_tempsBarre.asSeconds(), 0));
        }
        else
        {
            barre.setPosition(0, barrePosY);
        }
    }
    else if(Keyboard::isKeyPressed(Keyboard::Right))
    {
        if(barre.getPosition().x < largeurFenetre - largeurBarre)
        {
            barre.move(Vector2f(vitesseBarre * m_tempsBarre.asSeconds(), 0));
        }
        else
        {
            barre.setPosition(largeurFenetre - largeurBarre, barrePosY);
        }
    }
}
 

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #1 le: Septembre 06, 2015, 05:04:59 pm »
Et si tu actives juste la synchronisation verticale ça donne quoi ?

Phounet

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #2 le: Septembre 06, 2015, 05:51:11 pm »
Salut,

Merci pour ta réponse.

Si j'active la VSync, l'utilisation du processeur est parfaite (quelques % seulement), mais le déplacement de la barre n'est pas fluide du tout.

Le problème reste donc entier :(

Phounet

Phounet

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #3 le: Septembre 07, 2015, 08:33:31 pm »
Quelqu'un aurait-il une solution svp?

Merci d'avance.

Phounet

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #4 le: Septembre 09, 2015, 11:16:41 am »
utilise la vsync, et base tes mouvement sur le deltatime , une recherche sur le forum fr/us de ce terme te donnera la réponse ( la doc aussi a ce sujet je crois )

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #5 le: Septembre 09, 2015, 05:47:57 pm »
C'est un peu déjà ce qu'il fait. ;)

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #6 le: Septembre 09, 2015, 08:18:26 pm »
j'avais pas vu, je m'étais concentré sur le main() pas sur le reste.  :-[

Phounet

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #7 le: Septembre 10, 2015, 09:48:59 pm »
Quelqu'un aurait d'autres idées svp? Je galère vraiment avec cette boucle de rendu qui me bouffe 100% du CPU (enfin, 100% d'un des 4 cœurs du CPU).

Ça me bloque dans mes (modestes) projets et j'ai l'impression de sécher sur le problème sans avancer.

Je vous remercie par avance,

Phounet

Demystificator

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #8 le: Septembre 11, 2015, 12:59:12 am »
Il faudrait des infos supplémentaires sur ce que tu utilises (carte graphique, version SFML, OS) ; pense à mettre les pilotes de la carte graphique à jour.

Aussi, quand tu dis que ce n'est pas fluide, c'est quel genre ? La barre semble se déplacer en retard ? Au ralenti ? Ou elle se "téléporte" ?

Après avoir cherché sur le net, il apparaît que la Vsync de SFML fait parfois des siennes et qu'à priori le must c'est de passer par ta carte graphique directement (note qu'il me semble que le Vsync de Nvidia n'a d'effet que si l'application est en plein écran ; en tout cas quand je m'en suis servi, ça ne prenait effet qu'en plein écran).

Je ne sais pas non plus si ça changerait quoi que ce soit, mais mettre ta Clock dans la boucle de window.isOpen() et restart immédiatement après les évènements et avant d'appeler ta méthode. T'auras plus qu'à passer le Time en argument ; cela te permettra aussi d'avoir le même temps pour tes futures méthodes bougerBalle, tout en évitant de devoir gérer plusieurs variables Time.

Il y aurait aussi peut-être une technique un peu sale qui consisterait à forcer  avec un sleep si ton image est rendue "bien trop vite" sans passer par vsync ou framelimiter.
Ca donnerait un truc du genre :
sf::Time time = clock.restart();
float temps_mort = 0.015 - time; //(1/60 de seconde)
if(temps_mort > 0)
      sf::Sleep(temps_mort);
 
Mais je pense pas que ce soit très propre puisque le Sleep n'est pas une science exacte ; ça va dépendre du PC, de ton OS et de ce qui tourne en plus de ton appli. Après, ça va toujours soulager ton CPU un minimum.

Après, j'imagine que si c'est pour apprendre ou si c'est un jeu qui demande beaucoup d'attention de la part du joueur, c'est pas bien grave si ça bouffe du proco ; y a pas mal de jeux en 2D dans le commerce qui bouffent 100% d'un coeur quoi qu'il arrive.
« Modifié: Septembre 11, 2015, 01:05:52 am par Demystificator »

Phounet

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #9 le: Septembre 15, 2015, 10:40:38 pm »
Je te remercie pour ta réponse.

Je suis sur Windows 7 en 64 bits, processeur i5-2520M, 8Go de RAM, SFML 2.3.1 sur CodeBlocks. Niveau hardware, je suis sur un portable Lenovo T520 (ce n'est pas tout neuf...ancienne machine du travail). Niveau carte graphique c'est limite.

Le problème est que si je ne limite pas le framerate, la batterie du laptop se vide très rapidement. Du coup, je limite le FPS à 480 (par exemple), et là niveau utilisation du CPU et de la batterie ça va. Le souci se situe sur la fluidité: la barre se "téléporte" très légèrement mais suffisamment pour que cela soit visible à l'oeil et donne un rendu très désagréable.

Le truc qui me paraît vraiment trop bizarre, ce que si j'ai autre chose qui tourne en plus de mon application (typiquement YouTube), alors la barre se déplace de manière tout à fait fluide.

Je pense donc que le souci se situe plus au niveau du hardware que du code pur, mais j'aimerais comprendre d'où vient le problème.

Merci d'avance à ceux qui pourront m'aider.

Phounet

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #10 le: Septembre 15, 2015, 11:29:43 pm »
Ton histoire de youtube est similaire à celle là : http://en.sfml-dev.org/forums/index.php?topic=18105
Et il est dit que ça a été résolu il y a longtemps. :/ Donc je ne sais pas. :p

Phounet

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Le processeur tourne à fond
« Réponse #11 le: Septembre 18, 2015, 09:43:15 pm »
En effet, mon problème est très similaire à celui mentionné dans le poste que tu as renseigné.

Il y est dit que c'est résolu. Pourtant, on dirait que ce ne l'est pas.

Laurent, penses-tu que ce soit possible?

Je vous remercie pour vos interventions.

Phounet