c# winform利用gdi+的双缓冲技术来提高绘图效率

c# winform利用gdi+的双缓冲技术来提高绘图效率

ID:18773196

大小:76.50 KB

页数:4页

时间:2018-09-23

c# winform利用gdi+的双缓冲技术来提高绘图效率_第1页
c# winform利用gdi+的双缓冲技术来提高绘图效率_第2页
c# winform利用gdi+的双缓冲技术来提高绘图效率_第3页
c# winform利用gdi+的双缓冲技术来提高绘图效率_第4页
资源描述:

《c# winform利用gdi+的双缓冲技术来提高绘图效率》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C#WinForm利用GDI+的双缓冲技术来提高绘图效率前言进入.NET时代,Windows的绘图技术也从GDI升级到了GDI+,从名字就能知道GDI+是对以前传统GDI绘图技术的一次升级,不过在微软几乎把所有的新技术都冠之.NET的情况下,GDI+竟然不叫做GDI.NET,还真让我感到有点意外了。:)GDI+在一种与设备无关的环境下提供了一套统一的绘图编程模型,极大的提高了Windows绘图编程的方便性,我们再也不用创建什么各种各样复杂的设备环境了,说实话,我现在想起来都头疼。题归正传,关于如何进行GDI+的基本编程,我

2、不能过多的加以描述,如果有对此概念还不太清楚的朋友,建议先去了解一下相关的资料,我们在这里主要讨论的是一种提高绘图效率(主要是动画效率)的双缓冲技术在GDI+中的应用和实现。实现目的为了能清楚的对比应用双缓冲技术前后的效果,我编写了一段程序来进行测试。首先,我创建了一个普通的WindowsApplication,在主Form中,我放置了一个定时器:timer1,然后将它的Interval属性设置为10,然后在Form上放置两个按纽,分别用来控制定时器的开启和关闭,最后,我还放置了一个label控件,用来显示绘图的帧数。测试

3、程序在timer1的timer1_Tick事件中,我写下了如下的代码(其中flag是一个bool型标志变量):DateTimet1=DateTime.Now;Graphicsg=this.CreateGraphics();if(flag){brush=newLinearGradientBrush(newPointF(0.0f,0.0f),newPointF(700.0f,300.0f),Color.Red,Color.Blue);flag=false;}else{brush=newLinearGradientBrush(n

4、ewPointF(0.0f,0.0f),newPointF(700.0f,300.0f),Color.Blue,Color.Red);flag=true;}for(intj=0;j<60;j++){for(inti=0;i<60;i++){g.FillEllipse(brush,i*10,j*10,10,10);}}DateTimet2=DateTime.Now;TimeSpansp=t2-t1;floatper=1000/sp.Milliseconds;this.label1.Text="速度:"+per.ToStrin

5、g()+"帧/秒";运行后,我点击“开始”按纽,效果如下图所示:应用双缓冲以前的效果图(帧数:5帧/秒)正如大家所看到的,我在程序中使用循环画了几百个圆形,然后在每次的定时器脉冲事件中使用不同方向的线性渐变来对它们进行填充,形成了一个动画效果。不过不幸的是,程序运行起来闪烁很严重,几乎每次刷新的时候都可以看到一条很明显的扫描线从上慢慢的刷到下来完成整幅图形的刷新动作。如果你不是要模拟老式雷达的区域扫描的话,这种速度不会满足你的要求。改进代码下面是我改进以后的代码:DateTimet1=DateTime.Now;Bitmap

6、bmp=newBitmap(600,600);Graphicsg=Graphics.FromImage(bmp);if(flag){brush=newLinearGradientBrush(newPointF(0.0f,0.0f),newPointF(700.0f,300.0f),Color.Red,Color.Blue);flag=false;}else{brush=newLinearGradientBrush(newPointF(0.0f,0.0f),newPointF(700.0f,300.0f),Color.Blu

7、e,Color.Red);flag=true;}for(intj=0;j<60;j++){for(inti=0;i<60;i++){g.FillEllipse(brush,i*10,j*10,10,10);}}this.CreateGraphics().DrawImage(bmp,0,0);DateTimet2=DateTime.Now;TimeSpansp=t2-t1;floatper=1000/sp.Milliseconds;this.label1.Text="速度:"+per.ToString()+"帧/秒";运行后

8、,我点击“开始”按纽,效果如下图所示:应用双缓冲以后的效果图(帧数:9帧/秒)经过改进后,画面刷新速度大大加快,绝对看不到任何的“扫描线”,帧数也从5帧一下就提高到了9帧,几乎是两倍于前的速度。这究竟是什么原因呢?让我来讲述其中的道理。因为圆是要一个一个画上去,所以每画一个圆,系统就要做一次图形的绘制操

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。