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 :

[Win32] Problème d'affichage


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut [Win32] Problème d'affichage
    Bonjour à tous et désoler d'avance dans le cas où je post dans la mauvaise section car je ne suis pas sûr ^^
    Je bosse actuellement sur un projet de Viewer de fichiers CAO en C++/Win32/OpenGL, je travaille avec l'api windows en C (donc pas de MFC) et j'ai un petit problème d'affichage. Enfaite j'ai une fenêtre principale qui contient plusieurs sous-fenêtres, contenant statusbar, toolbar, un treeview et une fenêtre contenant un affichage OpenGL.
    En gros dans ma boucle de message j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
    	TranslateMessage(&msg);
    	DispatchMessage(&msg);
    }
    else
    {
    	OpenGL_Render();
    }
    OpenGL_Render met à jour la scène et finit par un SwapBuffer pour l'afficher, et dans mon windowproc je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case WM_PAINT:
    {
    	SwapBuffers(g_pEngine->getDevice());
    	ValidateRect(hWnd,NULL);
    	break;
    }
    Vu que mon application est fenêtré et que des boites de dialogues peuvent passer dessus cela aurait du me permettre de rafraichir la scène au bon moment.
    Donc bon déjà premier problème dans mon WM_PAINT, Swapbuffer ne convient pas, j'aimerais juste que OpenGL reaffiche la dernière frame (qui est devenu le front buffer après le swap) de sorte que si l'utilisateur déplace une boite de dialogue sur ma fenêtre celle-ci soit comme mis en pause mais qu'il n'y est pas d'artefacts.
    De plus, et là il n'est pas question d'OpenGL, j'ai des problèmes d'actualisation d'affichage avec les autres fenêtres, quand une boite de dialogue se met sur mon treeview il peut arriver qu'un artefact se mette dessus...
    Encore plus génant, à un momen j'utilise une fenêtre non-modale pour gérer une barre de chargement et là c'est le drame, la fenêtre s'affiche vraiment très mal, on la voit complète une fraction de seconde quand elle apparait, puis on dirait que la fenêtre principale essaye de dessiner par dessus, au final il reste plus qu'un cadre gris et les barres de chargement qui évoluent (on ne voit même plus les textes au dessus de la barre de chargement).

    Si quelqu'un à déjà rencontrer ce genre de problème ou a une idée pour les résoudre je suis preneur.
    Merci d'avance

  2. #2
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Bon enfaite j'ai l'impression que si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case WM_PAINT:
    {
    	OpenGL_Render();
    	ValidateRect(hWnd,NULL);
    	break;
    }
    Ca règle mon problème pour ma fenêtre OpenGL.

    Donc le reste de mon problème c'est juste de l'api windows. J'ai une fenêtre non modale qui bug graphiquement et qui laisse des artefacts sur ma fenêtre modale principale ... une idée ?

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je veux pas dire de bétise mais:

    1. Ou tu as une appli 'statique' (le contenu OGL n'est modifié que par des actions utilisateurs), dans ce cas, tu peux utiliser le WM_PAINT, et faire le render / swap dedans.

    2. Ou ton appli est 'animée' (jeu vidéo), et dans ce cas on a comme boucle principale (en tout cas dans l'idée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while (!ended) {
        Render();
        Swap();
        while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
    	TranslateMessage(&msg);
    	DispatchMessage(&msg);
        }
        Sleep(0);
    }
    Je me trompe ?

    [edit] Tu peux utiliser aussi un 'timer' pour faire le rendu, mais adieu les 1000fps dans ce cas !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par nicroman Voir le message
    [edit] Tu peux utiliser aussi un 'timer' pour faire le rendu, mais adieu les 1000fps dans ce cas !
    Ça c'est bien un truc qui m'énerve. Un jeu va souvent tourner sans cesse à 100% CPU (et donc chauffer, consommer plus, faire faire du bruit au ventillos) même si au final il affiche des images sur un écran à 50Hz, et qu'il effectue ses calculs de physique ou d'IA encore moins vite. Tout ça parce que certains sont focalisés sur la fréquence d'image comme Alpha et Omega de la qualité d'un jeu...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Bas c'est surtout que si les fps sont supérieur à la fréquence de rafraichissement ça aura des conséquences graphiques... (scission de l'écran).
    Et en plus l'oeil humain fait pas la différence au delà des 30 ou 60, je sais jamais.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Goten Voir le message
    Et en plus l'oeil humain fait pas la différence au delà des 30 ou 60, je sais jamais.
    Ce n'est pas uniquement question de fréquence. J'ai eu des exemples où 60Hz ne faisait pas une animation totalement fluide, alors que 30 peuvent suffire largement dans d'autres cas. Je pense que la différence entre deux images successives est aussi un facteur déterminant.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Problème d'affichage
    Par mustang-gx dans le forum Bases de données
    Réponses: 8
    Dernier message: 26/01/2005, 22h54
  2. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59
  3. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 10h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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