简体   繁体   中英

How to redraw quickly on a canvas. C# WINFORM

For my software, I am using a Timer from Systems.timer library, every time my timer ticks, it calls a method for repainting my screen. I do not want to clear the screen, then to repaint on it. I just want to paint the new areas on it directly.

At the beginning, I did this:

Constructor{
   ...
   this.timer = new Timer
   {
      Interval = 10,
   };
   this.timer.Elapsed += OnPaint;
   this.timer.start();
}

public void OnPaint(Object sender, EventArgs e)
{
   This.Parent.OnPaintLoadingCircle();
   This.Parent.OnPaintReadyToBePaintedAreas();
}

Then I noticed it was much faster for painting when the OnPaint method contains this:

public void OnPaint(Object sender, EventArgs e)
{
   This.Parent.Invalidate();
}

So I have two questions:

QUESTION 1 :

Why is it faster???

Because when I call invalidate():

  • The UI thread clears the screen.
  • Then UI thread redraws the old areas
  • Then UI thread draws the loading circle
  • Then UI thread draws the new areas.

And when I call my two methods OnPaintLoadingCircle() and OnPaintReadyToBePaintedArea():

  • The timer thread draws the loading circle
  • Then the timer thread draws the new areas

QUESTION 2 :

I would like to know if it exists a way for asking a controller to draw it surface without clearing it. ( I tried this.Parent.Update(), this.Parent.Refresh(), both of them first clear the screen as well).

Thank you very much for helping me.

Why is it faster???

For the simplest of reasons: because when you call Invalidate() in the OnPaint() method, it forces re-painting of the window immediately , which is much more quickly than a timer could.

The timers in .NET are not suited for high-frequency operations. They only guarantee the time between intervals will be at least what you specify. The actual interval can and often is longer than what you specify, especially if you are using a very short interval (eg on the order of less than 10-20ms). This necessarily limits how often you can re-paint the window when using a timer, to a much greater degree than just re-painting the window as fast as you can.

I would like to know if it exists a way for asking a controller to draw it surface without clearing it.

Not easily, no. At the most basic level, you can override OnPaintBackground() and not call the base implementation. But this approach only works if you are prepared to redraw everything, because the system counts on you covering up stale pixels with the correct pixels when you draw.

In fact, a much more common approach is to use double-buffering. The most basic form is to just set the DoubleBuffered property in the control constructor. But you can also combine not clearing the window with maintaining your own offscreen Bitmap object into which you draw your content. Then when a Paint event happens, you just copy the Bitmap to the window.

A much more complicated approach involves hosting a Direct2D surface in your window. Not for the faint of heart, but should offer the best possible performance in a Winforms program.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM