Members

Technology Zones

Articles

Hosted By

MaximumASP

Info

Rated
Read 31,339 times

Related Categories

Double buffering in .NET

simonsoanes

Ever wondered how to double buffer with a Graphics object so your GDI+ based game/control doesn't flicker annoyingly? Me too.  There's probably a built in method that's easier, but this is how I managed to get it to work smoothly, it's nice and simple and allows you to draw anywhere that offers up the normal CreateGraphics method.

First, set up a bitmap to act as your backbuffer:

C#

Bitmap BackBuffer = new Bitmap(this.ClientSize.Width,this.ClientSize.Height);
Graphics DrawingArea = Graphics.FromImage(BackBuffer);

VB.NET

Dim BackBuffer As New Bitmap(Me.ClientSize.Width,Me.ClientSize.Height)
Dim DrawingArea As Graphics = Graphics.FromImage(BackBuffer)

Next, you want to draw to your graphics object as normal, so DrawingArea.Clear(Color.Black) and such.

Once you've completed drawing the object that you want to smoothly move, simply draw the pre-rendered bitmap over the top of the Graphics object you want to update:

C#

Graphics Viewable = Me.CreateGraphics();
Viewable.DrawImageUnscaled(BackBuffer, 0, 0);

VB.NET

Dim Viewable As Graphics = Me.CreateGraphics()
Viewable.DrawImageUnscaled(BackBuffer, 0, 0)

You can also use other techniques to increase the performance, such as reusing the backbuffer by defining it in the class you're using it in - this means .NET won't need to recreate it repeatedly.

Updated: I have just noticed there's a Control.SetStyle method that automates double buffering in many situations where you are drawing to a control - place this in the forms initialisation:

this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();

Comments

  • Re: [4668] Double buffering in .NET

    Posted by wurakeem on 22 Sep 2006

    Simply awesome way to do double buffering. I am creating my first windows drawing application using double buffering that you suggested and I absolutely love it! so simple and yet so effective ! Thank...