【转】C# GDI+ 图像的双缓存技术

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Text;
  7 using System.Windows.Forms;
  8 using System.Drawing.Drawing2D;
  9 
 10 namespace DoubleBuffer
 11 {
 12     public partial class Form1 : Form
 13     {
 14         bool flag = true;
 15         Brush brush;
 16         public Form1()
 17         {
 18             InitializeComponent();
 19         }
 20 
 21         private void timerTest_Tick(object sender, EventArgs e)
 22         {
 23             if (rbYes.Checked)//默认
 24             {
 25                 BasicDraw();
 26             }
 27             if(rbUser.Checked)//自己实现双缓冲原理
 28                 UseMyImage();
 29             if (rbManual.Checked)//手动管理双缓冲
 30             {
 31                 UseDoubleBuffer();
 32             }
 33             
 34          }
 35         private void BasicDraw()
 36         {
 37             DateTime t1 = DateTime.Now;
 38             Graphics g = this.CreateGraphics();
 39             Draw(g);
 40             DateTime t2 = DateTime.Now;
 41             TimeSpan sp = t2 - t1;
 42             float per = 1000 / sp.Milliseconds;
 43             lbSpeed.Text = "速度:" + per.ToString() + "帧/秒";
 44         }
 45         private void UseMyImage()
 46         {
 47             DateTime t1 = DateTime.Now;
 48             Bitmap bmp = new Bitmap(600600);
 49             Graphics g = Graphics.FromImage(bmp);
 50             Draw(g);
 51             this.CreateGraphics().DrawImage(bmp, 00);
 52             DateTime t2 = DateTime.Now;
 53             TimeSpan sp = t2 - t1;
 54             float per = 1000 / sp.Milliseconds;
 55             lbSpeed.Text = "速度:" + per.ToString() + "帧/秒";
 56         }
 57         private void UseDoubleBuffer()
 58         {
 59             BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;
 60             BufferedGraphics myBuffer = currentContext.Allocate(this.CreateGraphics(), this.DisplayRectangle);
 61             DateTime t1 = DateTime.Now;
 62             Graphics g = myBuffer.Graphics;
 63             g.Clear(Button.DefaultBackColor);
 64             Draw(g);
 65             myBuffer.Render();
 66             DateTime t2 = DateTime.Now;
 67             TimeSpan sp = t2 - t1;
 68             float per = 1000 / sp.Milliseconds;
 69             lbSpeed.Text = "速度:" + per.ToString() + "帧/秒";
 70             myBuffer.Dispose(); 
 71 
 72         }
 73         private void Draw(Graphics g)
 74         {
 75             if (flag)
 76             {
 77                 brush = new LinearGradientBrush(new PointF(0.0f0.0f),
 78                     new PointF(700.0f300.0f), Color.Red, Color.Blue);
 79                 flag = false;
 80             }
 81             else
 82             {
 83                 brush = new LinearGradientBrush(new PointF(0.0f0.0f),
 84                     new PointF(700.0f300.0f), Color.Blue, Color.Red);
 85                 flag = true;
 86             }
 87             for (int j = 0; j < 60; j++)
 88             {
 89                 for (int i = 0; i < 60; i++)
 90                 {
 91                     g.FillEllipse(brush, i * 10, j * 101010);
 92                 }
 93             }
 94         }
 95 
 96         private void btnStart_Click(object sender, EventArgs e)
 97         {
 98             timerTest.Enabled = true;
 99         }
100 
101         private void btnStop_Click(object sender, EventArgs e)
102         {
103             timerTest.Enabled = false;
104         }
105     }
106 }
107 

 

posted @ 2010-03-15 20:30  LW8776  阅读(2140)  评论(0编辑  收藏  举报