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( 600 , 600 );
49 Graphics g = Graphics.FromImage(bmp);
50 Draw(g);
51 this .CreateGraphics().DrawImage(bmp, 0 , 0 );
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.0f , 0.0f ),
78 new PointF( 700.0f , 300.0f ), Color.Red, Color.Blue);
79 flag = false ;
80 }
81 else
82 {
83 brush = new LinearGradientBrush( new PointF( 0.0f , 0.0f ),
84 new PointF( 700.0f , 300.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 * 10 , 10 , 10 );
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
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( 600 , 600 );
49 Graphics g = Graphics.FromImage(bmp);
50 Draw(g);
51 this .CreateGraphics().DrawImage(bmp, 0 , 0 );
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.0f , 0.0f ),
78 new PointF( 700.0f , 300.0f ), Color.Red, Color.Blue);
79 flag = false ;
80 }
81 else
82 {
83 brush = new LinearGradientBrush( new PointF( 0.0f , 0.0f ),
84 new PointF( 700.0f , 300.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 * 10 , 10 , 10 );
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