ads

Diminuire l’effetto flickering aumentando le prestazioni in GDI+

Marzo 12th, 2009 2 Comments   Posted in Programmazione

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. 🙂

Ti piace questo articolo? Condividilo: