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

Windows Discussion :

double buffering avec l'API Windows


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut double buffering avec l'API Windows
    Bonjour à tous.
    Je voudrai savoir comment gérer le double buffering avec l'API Windows.
    Créer deux memory device contexts et les copier l'un après l'autre sur le display device context avec BitBlt fait presque du double buffering, puisque cela donne le même rendu, mais en plus lent, non?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, c'est sans doute plus lent.
    Mais je ne crois pas qu'on puisse faire mieux en GDI...

    DirectX, par contre, peut surement faire du "vrai" double-buffering.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par _Michel Voir le message
    Bonjour à tous.
    Je voudrai savoir comment gérer le double buffering avec l'API Windows.
    Créer deux memory device contexts et les copier l'un après l'autre sur le display device context avec BitBlt fait presque du double buffering, puisque cela donne le même rendu, mais en plus lent, non?
    Rien ne t'empêche de faire l'essai...on dit que le GDI est lent mais bien utilisé cela peut donner des résultats satisfaisants..
    Si les performances ne sont pas satisfaisantes oui alors utiliser l'accélération matérielle avec Direct X.
    Tout dépend de ce que tu veux faire...si c'est juste quelques animations le GDI peut parfois suffire

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Pour le double buffering pourquoi ne pas utiliser WGL ? Renseigne-toi sur la structure PIXELFORMATDESCRIPTOR et la fonction SwapBuffers.

    Citation Envoyé par Mat.M
    On dit que le GDI est lente mais bien utilisée elle peut donner des résultats satisfaisants ...
    En fait ce sont les fonctions de dessin (Rectangle, Ellipse, etc.) de la GDI qui sont lentes, pas la GDI elle-même (l'affichage OpenGL sous Windows utilise la GDI ...). Mais t'as raison, bien utilisée, cette API peut faire des choses presque incroyables.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    Oui, c'est pour une application qui n'a pas besoin de grosses machines come OpenGL ou DirectX.
    Mais pour ma culture, pourquoi on à pas acces à l'accéleration matérielle ni aux buffers avec GDI?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    En parlant de rapidité, avec quelles fonction peut-on acceder rapidement au bitmap?
    Je suppose qu'il n'y a rien de plus rapide que l'acces direct à la mémoire et je suppose qu'il n'y a rien de plus lent que SetPixel.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet.
    Déjà, SetPixelV() est plus rapide, mais si tu veux vraiment de la vitesse, utilise un DIB (Device-Independent Bitmap), que tu peux obtenir avec le bon paramètre de LoadImage(), ou créer à partir de rien avec la fonction CreateDIBSection().

    Avec un DIB, tu disposes d'un accès direct à la mémoire des pixels du bitmap.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par _Michel
    Mais pour ma culture, pourquoi on n'a pas accès à l'accélération matérielle ni aux buffers avec GDI ?
    Pour l'accélération matérielle, parce que la GDI est une API de haut niveau qui se veut d'être indépendante du matériel alors qu'OpenGL par exemple est une interface de programmation vers la carte graphique. Même raisons pour le double buffering (pas de double buffers avec une imprimante par exemple ...).

    Citation Envoyé par _Michel
    En parlant de rapidité, avec quelles fonction peut-on accéder rapidement au bitmap ? Je suppose qu'il n'y a rien de plus rapide que l'accès direct à la mémoire et je suppose qu'il n'y a rien de plus lent que SetPixel.
    Médinoc t'as déjà répondu mais pour ajouter à ce qu'il a dit, bien exploiter les régions valides / invalides permet aussi d'améliorer considérablement la vitesse. Le principe c'est que pour actualiser un dessin, il suffit d'invalider le plus petit rectangle contenant la zone à redessiner et lors du traitement de WM_PAINT, utiliser le handle retourné par BeginPaint car ce handle ne permet de dessiner que dans le rectangle qui fut invalide.

    Quant à SetPixel(V), c'est lent lorsqu'elle est utilisée en boucle car elle n'est pas optimisée, alors que les autres fonctions de dessin utilisent en quelque sorte un SetPixel optimisé. Ne serait-ce que le coût d'un appel de fonction, ça pénalise déjà le programme ...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    Ok merci. Juste une dernièrequestion : quand on selectionne un bitmap dans un DC cela ne l'affiche pas et on ne peut rien faire avec. Pourtant si on le selectionne dans un memory DC, là on peut utiliser les fonctions du GDI.
    Comment ça se fait? C'est dans la nature des DC?

  10. #10
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    On ne peut sélectionner un bitmap que sur un DC en mémoire (lire la doc de SelectObject).

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut

    Merci beaucoup.

  12. #12
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par _Michel Voir le message
    Oui, c'est pour une application qui n'a pas besoin de grosses machines come OpenGL ou DirectX.
    Mais pour ma culture, pourquoi on à pas acces à l'accéleration matérielle ni aux buffers avec GDI?
    Je te conseille de consulter la doc de Direct X ; tu y trouveras un schéma qui t'expliques cela..
    pour faire simple Direct X "shunte" ou bien appelle en parallèle au GDI les fonctionnalités de la carte graphique..
    sinon basiquement pourquoi le GDI n'appelle pas l'accélération matérielle c'est une bonne question...
    parce que au début Windows n'était pas prévu pour faire de la 3d et il n'y avait pas de cartes avec puce 3d..
    et comme le dit Melem le GDI est plus haut niveau...
    Direct X a été crée par Microsoft pour un accès direct à la VRAM ou mem vidéo..
    pour les premières versions de Direct X tu n'avais que DirectDraw tu n'avais pas de 3d et tu faisais comme en assembleur à accéder à la mémoire vidéo pour afficher des pixels....
    et puis Microsoft veut maintenir une compatibilité ascendante, je crois qu'il ya un verrou win16 dans le GDI qui t'empêche de faire des graphismes performants

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    Oui, il parait que win32 est condamné à devenir du passé (dommage, ça marche bien pourtant, mieux que cette daube de .NET etc etc).

    Pour la doc du sdk, j'ai pas trouvé, mais c'est pas grave, je compte m'y mettre un jour et voir ça de près.

  14. #14
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par _Michel Voir le message
    Oui, il parait que win32 est condamné à devenir du passé (dommage, ça marche bien pourtant, mieux que cette daube de .NET etc etc).

    Pour la doc du sdk, j'ai pas trouvé, mais c'est pas grave, je compte m'y mettre un jour et voir ça de près.
    Qui a dit cela que win32 va devenir du passé ?? M'étonnerait, avec VC++2008 il ya même une nouvelle version pour les MFC

    Pour Direct X il faut télécharger le SDK
    mieux que cette daube de .NET
    C'est pas moi qui l'ai dit mais tu devineras mon pressentiment là dessus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/12/2005, 11h37
  2. Tutorial d'initiation a la programmation avec l'API Windows
    Par mcdonald dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 16/09/2005, 17h20
  3. Stocker un imprim ecran sous bmp avec l'api windows
    Par Tofalu dans le forum Windows
    Réponses: 7
    Dernier message: 04/05/2005, 11h32
  4. Réponses: 3
    Dernier message: 09/11/2004, 10h44

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