胖在一方

出得厅堂入得厨房的胖子

导航

GDI+双缓冲的应用

Posted on 2006-09-12 16:31  胖在一方  阅读(651)  评论(0)    收藏  举报
为了能清楚的对比应用双缓冲技术前后的效果,我编写了一段程序来进行测试。首先,我创建了一个普通的Windows Application,在主Form中,我放置了一个定时器:timer1,然后将它的Interval属性设置为10,然后在Form上放置两个按纽,分别用来控制定时器的开启和关闭,最后,我还放置了一个label控件,用来显示绘图的帧数。
    
'----------------------------------------------------------------

    ' 不使用双缓冲的代码,能明显的看到一条扫描线,从左到右,帧数为 2
    '----------------------------------------------------------------
    '开始的时间
    Dim t1 As DateTime = DateTime.Now
    
Dim g As Graphics =
 Me.CreateGraphics()
    
Dim brush As
 Brush
    
If flag Then  '不停的变化颜色

        brush = New LinearGradientBrush(New PointF(0.0F, 0.0F), New PointF(500.0F, 500.0F), Color.Red, Color.Green)
        flag 
= False

    
Else
        brush 
= New LinearGradientBrush(New PointF(0.0F, 0.0F), New PointF(500.0F, 500.0F), Color.Green, Color.Red)
        flag 
= True

    
End If
    
'输出图形
    Dim i, j As Integer
    
For i = 0 To 60
        
For j = 0 To 60
            g.FillEllipse(brush, i 
* 10, j * 101010)
        
Next

    
Next
    
Dim t2 As DateTime = DateTime.Now
    
Dim span As TimeSpan =
 t2.Subtract(t1)
    Me.lblZS.Text 
= 1000 /
 span.Milliseconds

        
'------------------------------------------------------------

        '使用双缓冲代码
        '------------------------------------------------------------
        Dim t1 As DateTime = DateTime.Now [color=Green]'开始时间
        Dim bmp As New Bitmap(500500)
        
Dim g As Graphics =
 Graphics.FromImage(bmp)
        
Dim brush As
 Brush
        
If flag Then  '不停的变化颜色

            brush = New LinearGradientBrush(New PointF(0.0F, 0.0F), New PointF(500.0F, 500.0F), Color.Red, Color.Green)
            flag 
= False

        
Else
            brush 
= New LinearGradientBrush(New PointF(0.0F, 0.0F), New PointF(500.0F, 500.0F), Color.Green, Color.Red)
            flag 
= True

        
End If
        
'输出图形
        Dim i, j As Integer
        
For i = 0 To 60
            
For j = 0 To 60
                g.FillEllipse(brush, i 
* 10, j * 101010)
            
Next

        
Next
        Me.CreateGraphics().DrawImage(bmp, 
00)
        
Dim t2 As DateTime = DateTime.Now '结束时间

        Dim span As TimeSpan = t2.Subtract(t1)
        Me.lblZS.Text 
= 1000 /
 span.Milliseconds
        
'----------------------------------------------------------------------------------------------------------------

        '使用双缓冲代码,没有看到扫描线,而且速度提高到11,
        '绘制图形很消耗系统资源,如果要绘制的图形很多的话,系统开开销很大,会出现刷新缓慢的效果,
        '
        '而使用双缓冲代码则没有这个问题,道理是先在内存中开辟一个虚拟的画布,先在这个画布上绘制图形,然后在把这个画布一次

        '性的绘制到屏幕上去,系统的开销不是很大。
        '
        '具体的步骤描述

        ' 1、在内存中建立一个虚拟的画布
        '           Dim bmp As New Bitmap(500, 500)
        ' 2、获取这个画布的Graphics的引用
        '           Dim g As Graphics = Graphics.FromImage(bmp)
        ' 3、在这个画布上绘制图形
        '           g.FillEllipse(brush, i * 10, j * 10, 10, 10)
        ' 4、将这个画布绘制到屏幕上去
        '           Me.CreateGraphics().DrawImage(bmp, 0, 0)    
        '----------------------------------------------------------------------------------------------------------------