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

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

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.