全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C# WinForm利用GDI+的双缓冲技术来提高绘图效率前言进入.NET时代,Windows的绘图技术也从GDI升级到了GDI+,从名字就能知道GDI+是对以前传统GDI绘图技术的一次升级,不过在微软几乎把所有的新技术都冠之.NET的情况下,GDI+竟然不叫做GDI.NET,还真让我感到有点意外了。 :)GDI+在一种与设备无关的环境下提供了一套统一的绘图编程模型,极大的提高了Windows绘图编程的方便性,我们再也不用创建什么各种各样复杂的设备环境了,说实话,我现在想起来都头疼。题归正传,关于如何进行GDI+的基本编程,我不能过多的加以描述,如果有对此概念还不太清楚的朋友,建议先去了解一下相关的资料,我们在这里主要讨论的是一种提高绘图效率(主要是动画效率)的双缓冲技术在GDI+中的应用和实现。实现目的为了能清楚的对比应用双缓冲技术前后的效果,我编写了一段程序来进行测试。首先,我创建了一个普通的Windows Application,在主Form中,我放置了一个定时器:timer1,然后将它的Interval属性设置为10,然后在Form上放置两个按纽,分别用来控制定时器的开启和关闭,最后,我还放置了一个label控件,用来显示绘图的帧数。测试程序在timer1的timer1_Tick事件中,我写下了如下的代码(其中flag是一个bool型标志变量):DateTime t1 = DateTime.Now;Graphics g = this.CreateGraphics();if(flag) brush = new LinearGradientBrush(new PointF(0.0f, 0.0f), new PointF(700.0f, 300.0f), Color.Red, Color.Blue); flag = false;else brush = new LinearGradientBrush(new PointF(0.0f, 0.0f), new PointF(700.0f, 300.0f), Color.Blue, Color.Red); flag = true;for(int j = 0; j 60; j +) for(int i = 0; i 60; i+) g.FillEllipse(brush, i * 10, j * 10, 10, 10); DateTime t2 = DateTime.Now;TimeSpan sp = t2 - t1;float per = 1000 / sp.Milliseconds;this.label1.Text = 速度: + per.ToString() + 帧/秒;运行后,我点击“开始”按纽,效果如下图所示:应用双缓冲以前的效果图(帧数:5帧/秒)正如大家所看到的,我在程序中使用循环画了几百个圆形,然后在每次的定时器脉冲事件中使用不同方向的线性渐变来对它们进行填充,形成了一个动画效果。不过不幸的是,程序运行起来闪烁很严重,几乎每次刷新的时候都可以看到一条很明显的扫描线从上慢慢的刷到下来完成整幅图形的刷新动作。如果你不是要模拟老式雷达的区域扫描的话,这种速度不会满足你的要求。改进代码下面是我改进以后的代码:DateTime t1 = DateTime.Now;Bitmap bmp = new Bitmap(600, 600);Graphics g = Graphics.FromImage(bmp);if(flag) brush = new LinearGradientBrush(new PointF(0.0f, 0.0f), new PointF(700.0f, 300.0f), Color.Red, Color.Blue); flag = false;else brush = new LinearGradientBrush(new PointF(0.0f, 0.0f), new PointF(700.0f, 300.0f), Color.Blue, Color.Red); flag = true;for(int j = 0; j 60; j +) for(int i = 0; i 60; i+) g.FillEllipse(brush, i * 10, j * 10, 10, 10); this.CreateGraphics().DrawImage(bmp, 0, 0);DateTime t2 = DateTime.Now;TimeSpan sp = t2 - t1;float per = 1000 / sp.Milliseconds;this.label1.Text = 速度: + per.ToString() + 帧/秒;运行后,我点击“开始”按纽,效果如下图所示:应用双缓冲以后的效果图(帧数:9帧/秒)经过改进后,画面刷新速度大大加快,绝对看不到任何的“扫描线”,帧数也从5帧一下就提高到了9帧,几乎是两倍于前的速度。这究竟是什么原因呢?让我来讲述其中的道理。因为圆是要一个一个画上去,所以每画一个圆,系统就要做一次图形的绘制操作,图形的重绘是很占用资源的,当需要重绘的图形数量很多的时候,所造成的系统开销就特别大,造成我们看到的那种刷新缓慢的情况。那么如何来解决这个问题呢?答案就是双缓冲,何谓“双缓冲”?它的基本原理就是:先在内存中开辟一块虚拟画布,然后将所有需要画的图形先画在这块“虚拟画布”上,最后在一次性将整块画布画到真正的窗体上。因为所有的单个图形的绘制都不是真正的调用显示系统来“画”,所以不会占用显示系统的开销,极大的提高的绘图效率。实现双缓冲的具体步骤我再来详细解释一下刚才实现双缓冲的具体步骤:1、在内存中建立一块“虚拟画布”:Bitmap bmp = new Bitmap(600, 600);2、获取这块内存画布的Graphics引用:Graphics g = Graphics
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年中国绘画活动说课稿
- 2025-2026学年大班 借形想象 说课稿
- 2025-2026学年冬至说课稿视频
- 2025-2026学年上海蘑菇教育说课稿
- 2025-2026学年三只小猪音乐教学说课稿
- 2026下半年文秘岗招聘考试全真模拟题库含解析
- 山东政务服务中心招聘考试专项训练题库及解析
- 2025-2026学年大班科学说课稿格式
- 2025-2026学年复杂相遇问题说课稿
- 人教版三年级上册第六单元 分数的初步认识 基础测试卷
- 统编版初中道德与法治九年级上册6.3文化自信日益增强 议题式教学课件(共35张)+内嵌视频
- 2026年卫生信息化系统管理岗医疗卫生事业招聘考试笔试试题(含答案)
- 大学英语四级词汇表 (完美打印版)
- 精神科患者的团体治疗护理
- DB54∕T 0533-2025 公路养护预算指标(定额)
- 5.1《从小爱劳动》课件 统编版道德与法治三年级下册
- 高校教师资格证之高等教育学完整版及答案【历年真题】
- T/CIS 67002-20213种剧毒鹅膏菌的物种鉴别PCR扩增-Sanger测序法
- 仁爱科普版(2024)七年级下册英语期末复习:语法填空+阅读理解+完型填空 解题技巧+练习题汇编(含答案解析)
- 《高速公路互通式立交桥设计原理》课件
- 社会工作概论课件
评论
0/150
提交评论