Posts Tagged ‘Windows Form’
Diminuire l’effetto flickering aumentando le prestazioni in GDI+
Quando si iniziare ad utilizzare GDI+ nel .NET Framework il primo problema da affrontare è il così detto effetto flickering. Il flickering è quel fastidioso sfarfallio che vediamo quando disegniamo un oggetto in GDI+, come un rettangolo o un cerchio.
Esistono numerosi trucchetti per togliere, almeno parzialmente, questo problema e contemporaneamente aumentare le prestazioni grafiche. Il primo consiglio è quello di impostare la proprietà DoubleBuffer della Windows Form a True. Anche se il consumo di memoria aumenterà le prestazioni ne beneficeranno. Inoltre è bene impostare altre proprietà interessanti. Possiamo fare tutto in un colpo solo impostando un’insieme di stili nel costruttore della windows form. In questo modo:
1: public Form1()
2: {
3: this.InitializeComponent();
4:
5: this.SetStyle(ControlStyles.UserPaint, true);
6: this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
7: this.SetStyle(ControlStyles.DoubleBuffer, true);
8: this.SetStyle(ControlStyles.ResizeRedraw, true);
9: this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
10: this.UpdateStyles();
11: }
Questo sistema dovrebbe bastare per ridurre notevolmente il flickering. Ma se volete spingere al massimo le prestazioni c’è ancora una cosa che si può fare: utilizzare un’immagine bitmap come buffer ulteriore. In questo modo gli oggetti vengono prima disegnati sulla bitmap di buffer e successivamente la bitmap viene a sua volta renderizzata sulla form. In questo modo:
1: private void Form1_Paint(object sender, PaintEventArgs e)
2: {
3: // Creo una bitmap in memoria.
4: Bitmap buffer = new Bitmap(this.Width, this.Height);
5:
6: // Utilizzo l'oggetto Graphics della bitmap
7: // e disegno tutti i miei oggetti.
8: using (Graphics graphics = Graphics.FromImage(buffer))
9: {
10: // disegno tutti i miei oggetti.
11: }
12:
13: // Pulisco la superficie della form e disegno
14: // l'immagine che ho in memoria.
15: e.Graphics.Clear(this.BackColor);
16: e.Graphics.DrawImage(buffer, 0, 0, buffer.Width, buffer.Height);
17: }
Le prestazioni sono garantite. 🙂