Graphique utilisant le double buffering (enléve l'effet de clignotement)

Soyez le premier à donner votre avis sur cette source.

Vue 13 820 fois - Téléchargée 766 fois

Description

Beaucoup se demande pourquoi l'image clignote dès que l'on surcharge un peu trop un graphique, et surtout comment éviter cela.

Eh bien cette source montre comment résoudre ce problème en utilisant le "Double buffering", grâce à la classe .NET "BufferedGraphics"

Cette source redonne de l'espoir à tous ceux qui croyaient (à tords) que le GDI+ était une librairie mal étudiée et lente par-dessus tout.

Pour illustrer le problème de la lenteur j'ai décidé d'ajouter des formes de toutes les couleurs s'agitant dans un panel, le nombre de fps souhaités est réglable et le nombre de formes dessinées à l'écran s'adapte automatiquement, j'atteins pour ma part ~40-50 FPS avec 100 formes dessinées.

J'ai choisi de commenter mon code au maximum pour qu'il soit accessible à tous.

Source / Exemple :


Public Class Form1

        ''' C'est le graphique avec lequelle on va dessiner dans un premier temps, puis afficher
        Private BufferredGraphic As BufferedGraphics

        ''' C'est l'objet qui permet d'allouer de la mémoire tampon pour stockage du bitmap de dessin
        Private CurrentContext As BufferedGraphicsContext

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            'On alloue la mémoire tampon de dessin
            BufferredGraphic = Me.CurrentContext.Allocate(Me.CreateGraphics(), Me.DisplayRectangle)

        End Sub

        Private Sub Dessin()

            'On dessine dans la mémoire
            BufferredGraphic.Graphics.Clear(Color.White)

            'Déclenche l'évenement OnPaint de la fenêtre
            Me.Form1_Paint(Me, New PaintEventArgs(Me.BufferredGraphic.Graphics, Me.Form1.DisplayRectangle))

        End Sub

        Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Form1.Paint

            'Affiche enfin à l'écran le graphique contenue dans la mémoire, de manière persistante
            BufferredGraphic.Render()

        End Sub

    End Class

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

larryj
Messages postés
3
Date d'inscription
mercredi 6 décembre 2000
Statut
Membre
Dernière intervention
9 juin 2009
-
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
-
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
-
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
234
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
3 novembre 2011
-
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
234
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
3 novembre 2011
-
Bonjour guillaume1136,
Chez moi les polygones sont tous en noir et blanc ? Est-ce un bogue ou est-ce normal ?

Simon

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.