IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Fonction sleep et consommation CPU


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut Fonction sleep et consommation CPU
    Bonjour à tous,

    Je suis confronté au traditionnel problème de l'utilisation CPU. Lorsque j'utillise DirectX pour programmer (notamment des intergaces graphiques), je peux synchroniser ma boucle principale sur l'affichage avec D3DPRESENTINTERVAL. J'utilise actuellement OpenGL, et là, la synchronisation n'arrête pas la boucle (j'ai l'impression qu'elle limite l'affichage quand même).
    J'ai donc décidé de mettre un sleep(1) si mon programme était assez rapide. Parfait. Je lance le gestionnaire des taches windows, et là, je consomme encore presque 80% du cpu (d'un de mes 2 cpu en tout cas) ! Je décide donc de lancer un profiler : LTProf. Je relance mon programme, et là, j'analyse les résultats : 95% du temps est passé dans la fonction sleep(1), sauf que ma consommation cpu n'est pourtant pas réduite de 95% !! Comment expliquer ça ?? C'est un grand mystère pour moi...

    Merci,
    Thomas

  2. #2
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    OpenGL et le vsync, erf :/

    J'ai eu le même probleme recemment.

    Pas encore trouvé de solution miracle.

    Par contre, la fonction Sleep de windows, exactement comme celle de linux, est guarantie d'utiliser 0% du proc tant qu'elle tourne.

    Donc, hypothese pour toi :

    Verifie tes Fps.

    Si tu cherche quelque chose comme 60 Fps ( limite habituelle du vsync, donc, ça ou 75), tu devrais plus essayer des sleep(10) ou 15, et voir ce que ça donne question proc ...

    Il se peut aussi ( a verifier, ça m'interesse) qu'openGL tourne en boucle comme un boulet jusqu'au vsync, comme tu lui demande, *puis* effectue ton sleep, ce qui expliquerai des utilisations proc abusives meme pour des fps faibles par rapport au max sans vsync ( 600 fps -> 60 fps devrait donner 10 % utilisation du proc, donc si tu observe 30%, mauvais).

    Dans tous les cas, ton profiler semble erroné :/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    Après une petite analyse, le gros ralentissement vient de la fonction SwapBuffers(hDC) !
    Si je l'enlève, bon, rien ne s'affiche, mais on tombe à quasi 0% de consommation processeur. Dès qu'on l'ajoute, ça devient le drame, et on passe de 0% à 100% (en fait, ça dépend de la taille de la fenetre : petite fenetre 30%, grande fenetre 100%...) !

    J'imagine que je dois oublier une option quelconque pour permettre d'optimiser SwapBuffers... mais quoi ???
    Pour info, voilà ma boucle principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(Decor.Rendu()==0)
    	return 0;
    if(Decor.Gestion()==0)
    	return 0;
    glFlush();
    SwapBuffers(hDC);

    Si quelqu'un a une idée, ça m'aiderait vraiment beaucoup !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    De retour...

    Visiblement, c'est clairement ma méthode de gestion d'opengl qui ne va pas. Je viens de chercher à droite à gauche, et je suis tombé sur un tutorial qui utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    auxInitDisplayMode(AUX_SINGLE | AUX_RGBA); 	//pas de Double-buffering
    	auxInitPosition(100,100,largeur,hauteur);
    	auxInitWindow("Triangle");
    	setupRC();
    	auxReshapeFunc(Reshape);				//fonction gérant le redimensionnement de la fenètre
    	auxMainLoop(Main_part);
    Et ça marche ! La consommation processeur est nulle, alors que le même programme qui utilise swapbuffers m'utilise 80% du proc... quelqu'un a-t-il une idée de la raison de cette complète imperformance de swapbuffers ???

    Visiblement, je suis bon pour revoir ma création de fenêtre et ma gestion de la souris et du clavier (basée sur des évènement windows)...

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Utilise plutôt SDL ou GLFW. (Je ne te conseille pas GLUT parce que c'est pas terrible)

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Ou bien SFML (cf ma signature)

  7. #7
    screetch
    Invité(e)
    Par défaut
    As tu change manuellement le rafrachissement vertical ? par defaut je pense qu'il y en a pas. Verifie bien que ca limite ton affichage.

    Sinon voila comment activer/desactiver la VSync dans OpenGL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        const char *extensions = reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS));
        if( strstr(extensions, "WGL_EXT_swap_control") == 0)
            return;
        else
        {
            wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress( "wglSwapIntervalEXT" );
     
            if(wglSwapIntervalEXT)
                wglSwapIntervalEXT(0);
        }

Discussions similaires

  1. Fonction Sleep presice à 100 Microsecondes
    Par bob8181_2000 dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/09/2005, 22h20
  2. Consommation CPU
    Par Kenshiro1980 dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 09/09/2005, 14h56
  3. [Apache] - URL Rewriting et consommation CPU
    Par Acti dans le forum Apache
    Réponses: 3
    Dernier message: 23/08/2005, 09h53
  4. [VB.NET] Fonction sleep
    Par Dnx dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/02/2005, 15h31
  5. [langage] fonction sleep + probleme fenetre dos
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2003, 19h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo