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

 

转载于:https://www.cnblogs.com/8776/articles/1686636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值