【转】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(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