GRAPHIQUE UTILISANT LE DOUBLE BUFFERING (ENLÉVE L'EFFET DE CLIGNOTEMENT)

FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008 - 10 oct. 2007 à 19:27
larryj Messages postés 3 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 9 juin 2009 - 28 juil. 2008 à 13:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44349-graphique-utilisant-le-double-buffering-enleve-l-effet-de-clignotement

larryj Messages postés 3 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 9 juin 2009
28 juil. 2008 à 13:13
merci beaucoup pour cette source
Ça va me permettre de terminé ma petite application.
10/10
nicolassan551 Messages postés 1 Date d'inscription mercredi 6 octobre 2004 Statut Membre Dernière intervention 3 juillet 2008
3 juil. 2008 à 16:19
oui, joli boulot Guillaume :)

c'est interessant de voir que l'on peut faire une animation sympa avec GDI+, je vais peut être me décider, j'hésitais entre wpf et directX !

Le code est propre, c'est sympa !
guillaume1136 Messages postés 21 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 3 juin 2008
3 juin 2008 à 20:54
Bonjour, merci pour tes commentaires, en faite oui c'est normal, pour que les formes soit en couleur tu dois changer la ligne suivante : Private Const DEGRADE_NAME As String = "Black and White" par Private Const DEGRADE_NAME As String = "Arc en ciel", elle se trouve dans le fichier FormMain, ligne 20. Oui d'autant plus que certaines fonctions du GDI+ sont très puissantes, comme celle qui permet de faire des dégradés dans un polygone, mais il n'y a pas d'exemple dans cette source.
The Meteorologist Messages postés 232 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 3 novembre 2011 1
1 juin 2008 à 15:44
Je n'ai pas pris assez le temps de regarder le code excuse-moi, ça m'a juste surpris en ayant vu la capture. En tout cas c'est très intéressant, je passais toujours par la case C++ pour programmer mes jeux étant donné que le rendu était toujours horrible avec GDI+. Maintenant j'y réfléchirais à deux fois, merci.

Simon
The Meteorologist Messages postés 232 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 3 novembre 2011 1
1 juin 2008 à 15:37
Bonjour guillaume1136,
Chez moi les polygones sont tous en noir et blanc ? Est-ce un bogue ou est-ce normal ?

Simon
guillaume1136 Messages postés 21 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 3 juin 2008
6 avril 2008 à 12:49
Salut

Merci, on peu dire que j'ai mis le temps sa fesait 6 mois que je devais le faire.
Oui en effet il y a une augmentation d'environ 10 fps.
Sinon le contenu dessiné est resté le même, il y avais déja la transparence des formes.
Par contre il y a une nouvelle classe pour l'affichage des couleurs.

Merci pour ta suggestion je vais corriger ça, et merci pour tes encouragements.
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
5 avril 2008 à 17:48
Salut!

C'est cool que t'ai mis à jour ton code.
Excellent code.

Mais j'ai pas gardé l'ancienne version.. Est-ce que tu as constaté une augmentation du FPS ?
Ou alors tu as aussi changé ce qui doit être affiché... Il y avait déjà la transparence des formes ?

Sinon une dernière suggestion :
La valeur du FPS change vraiment rapidement, c'est impossible à lire.
Essaye de la stabiliser en faisant une "moyenne glissante" sur les 100 dernières valeurs par exemple. Cette moyenne devrait changer moins vite..

En tout cas, pour moi, c'est 10/10
Ahweb Messages postés 48 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 15 octobre 2007
14 oct. 2007 à 21:08
Excellente source ;)

J'attendrai moi aussi la mise à jour :)
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
13 oct. 2007 à 20:26
Merci pour tes encouragements..
Et bon courage pour la mise à jour de ta source...
guillaume1136 Messages postés 21 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 3 juin 2008
13 oct. 2007 à 18:01
Merci de ton commentaire.

Ta méthode est très interressante, et bien plus logique au niveau de se qui se passe en mémoire en effet, c'est se que je voulait faire avec ma source, mais je m'en été juste aproché.

Je vais mettre à jour ma source avec ta méthode, j'ai constaté son efficacité avec ta source sur la chimie, c'est du joli boulot !!
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
13 oct. 2007 à 15:43
Bon programme. C'est vraiment bien fait.

J'ai pour ma part déjà été confronté au scintillement, et j'ai trouvé la solution dans l'aide MSDN. Mais le mécanisme de double buffer qu'elle décrit n'est pas le même que le tien.

Ton programme utilise deux Graphics, un en liaison avec un Bitmap pour dessiner dedans, et l'autre en liaison avec la surface de la Form pour transférer l'image à l'écran.

Le mécanisme que j'avais trouvé est le suivant :

''' Initialisation :
Dim currentContext As BufferedGraphicsContext
Dim myBuffer As BufferedGraphics

currentContext = BufferedGraphicsManager.Current

myBuffer = currentContext.Allocate(Me.CreateGraphics, Me.DisplayRectangle)
myBuffer.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality

''' On effectue les opérations de dessin
myBuffer.Graphics.Clear(Color.LightYellow)
myBuffer.Graphics.DrawRectangle(Pens.Blue, 10, 50, 60, 100)

''' On transfère ensuite le contenu de la mémoire tampon à l'écran
myBuffer.Render()

Je tire cet exemple d'ici :
http://msdn2.microsoft.com/fr-fr/library/b367a457(VS.80).aspx
http://msdn2.microsoft.com/fr-fr/library/ka0yazs1(VS.80).aspx

Avec ce mécanisme, on utilise vraiment une mise en mémoire tampon. C'est donc plus rapide et moins gourmand en ressources processeur.

Essaye de te pencher là dessus, mais je suis sûr que tu peux encore accélérer ton prog avec cette méthode.
apxa Messages postés 188 Date d'inscription mercredi 15 mai 2002 Statut Membre Dernière intervention 25 avril 2009
11 oct. 2007 à 20:26
iop all,
C'est très bien ca.
De toute facon il est bien connu que le principe de double buffering s'avere le plus efficace pour une fluidité d'animation.

Have Fun ;)
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
11 oct. 2007 à 19:54
+10 pour moi aussi (même si j'ai pas encore tout pigé au code lol, j'suis trop noob ^^)
TigerFab Messages postés 115 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 18 mai 2008
11 oct. 2007 à 19:39
Bravo, bel exemple concret et efficace ! 10/10 pour moi
guillaume1136 Messages postés 21 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 3 juin 2008
11 oct. 2007 à 16:14
Tout d’abord merci de tes commentaires,

Je viens de tester de déclencher l’événement OnPaint à partir de Panel1.Invalidate ()
mais le problème reste apparemment le même chez moi le graphique clignote toujours.

En revanche la solution pour déclencher cet événement sans que son graphique soit effacé est d'appeler l'événement en lui passant les bons paramètres:

Me.Panel1_Paint(Me, New PaintEventArgs(Viewable, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height)))

J'ai mis à jour ma source avec ceci.
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
11 oct. 2007 à 12:02
Ok dsl, j'ai trouvé ^^ il suffit de raccourcir le nom de ton dossier ou de le placer vers un chemin plus cours (style C:\soft\ et non pas c\docu & sett\utilisateur\bureau\prog....qui prends plus de 260 caractéres :p)
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
11 oct. 2007 à 11:59
le code est tres bien commenté, mais en revanche j'ai un bug de nom trop long !

Erreur 1 Impossible d'écrire dans le fichier de sortie "obj\Debug\Double_Buffered_Panel_Exemple.Resources.resources". Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier qualifié complet doit comprendre moins de 260 caractères et le nom du répertoire moins de 248 caractères. Double Buffered Panel Exemple
et ce trois fois de suite, plus un plantage du Svhost au lancement de VB studio, cela sens l'archive conrompue ! Peux tu la DL et regarder cela ? merci +++
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
11 oct. 2007 à 08:14
salut, je vais de ce pas étudier ton code,
mais perso je fais tout un tas de dessin dans le forms.paint et cela ne clignote pas. J'ai positionné le double buffer dans les propriétés et j'utilise un invalidate() à la place du refresh().
Conclusion, cela reste tout de même assez chaud pour un noob comme moi de trouver une méthode fiable et passe partout pour simplement faire un dessin -_-'
Merci pour ta source qui devrait me permettre d'avancer un peu. ++
guillaume1136 Messages postés 21 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 3 juin 2008
10 oct. 2007 à 20:12
Excuse moi j'ai oublier.

Pour que la demonstration ci-dessus marche il faut aussi ajouter Me.Panel1.Refresh()
a la fin du Sub Timer1.Tick
guillaume1136 Messages postés 21 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 3 juin 2008
10 oct. 2007 à 20:09
C'est ce que je voulais faire au départ mais à ma grande déception lorsque on déssine sur avec l'événement OnPaint l'image clignote à nouveau...

Explication: au déclanchement de l'évenement OnPaint le graphique est effacer.
Le temps que l'on affiche notre image, une image toute blanche qu vien se glisser.
Cela est du au taux de rafraichisement de l'écran, le temps entre l'effacement du graphique et l'affichage de notre image éxéde le temps qu'il faut à l'écran pour afficher une image, d'ou l'image blanche.

Il est dailleur interessent de constater que plus l'instruction avant l'affichage de notre image est longue plus le temps d'affichage de l'image blanche est long.

J'espère que mon explication est compréhensible.

Tu peu t'en faire la démonsration en ajoutant le sub :

Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
e.Graphics.DrawImage(Me.BackBuffer, 0, 0)
End Sub

et en suprimant le : Viewable.DrawImageUnscaled(BackBuffer, 0, 0)
a la fin du Sub Timer1.Tick
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
10 oct. 2007 à 19:27
Intéressant !

Dommage que tu ne donne pas d'exemple concret utilsant l'évènement onPaint ;)
Rejoignez-nous