为了增加自己对双缓冲绘图技术的理解,简要做个笔记(以Windows为例):

1、Windows 绘图原理 
我们在 Windows 环境下看到各种元素,如菜单、按钮、窗口、图像,从根本上说,都是“画”出来的。这时的屏幕,就相当于一块黑板,而 Windows 下的各种 GDI 要素,如画笔、画刷等,就相当于彩色粉笔了。我们在黑板上手工画图时,是一笔一划的,电脑亦然。只不过电脑的速度比手工快的太多,所以在我们看起来好像所有的图形文字都是同时出现的。 
2、普通绘图方式的局限 
上述绘图方式我们暂且称之为普通绘图方式吧。虽然这种方式能满足相当一部分的绘图需要,但是当要绘制的对象太复杂,尤其是含有位图时,电脑便力不从心了。这时的画面会显示的很慢,对于运动的画面,会给人“卡”住了的感觉,总之一个字:不爽。 
3、解决之道:双缓冲 
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。下面是原理图:

实现过程如下:

1、在内存中创建与画布一致的缓冲区

2、在缓冲区画图

3、将缓冲区位图拷贝到当前画布上

4、释放内存缓冲区

相关的VC函数: 
1)、为屏幕 DC 创建兼容的内存DC:CreateCompatibleDC()

if(!m_dcMemory.CreateCompatibleDC(NULL)) // CDC m_dcMemory;
{ ::PostQuitMessage(0);
} 

2)、创建位图:CreateCompatibleBitmap()

m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height()); // CBitmap m_Bmp;

3)、把位图选入设备环境:SelectObject(),可以理解为选择画布

::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp); 

4)、把绘制好的内存图形“拷贝“到屏幕上:BitBlt()

pdcView->BitBlt(0, 0, rt.Width(), rt.Height(), &m_dcMemory, 0, 0, SRCCOPY);

双缓冲技术绘图原理及简单的VC实现相关推荐

  1. java双缓冲绘图_Java双缓冲技术-绘图应用

    1屏幕产生闪烁的原因 由于在显示所绘制的图像时,调用了repaint方法.repaint方法被调用时,需要清除整个背景,然后才调用paint方法显示画面.这样,在清除背景和绘制图像的短暂时间间隔内被用 ...

  2. android 绘图 双缓存,Android开发之用双缓冲技术绘图

    双缓冲技术主要用在画图,动画效果上.其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去. 双缓冲技术可以有效防止闪烁.提高显示质量. DrawView.java: package ...

  3. NET框架下使用双缓冲技术绘图

    from http://bbs.nju.edu.cn/blogcon?userid=godwin&file=1178541360 本文主要介绍 .Net 框架的基本绘图技术.通过简要的介绍和示 ...

  4. (转).NET框架下使用双缓冲技术绘图

    本文主要介绍 .Net 框架的基本绘图技术.通过简要的介绍和示例程序来探讨绘图技术的优势.劣势以及其它相关注意事项. 简介 幸运的是当编写一个典型的Windows 窗体程序时,窗体和控件的绘制.效果等 ...

  5. 基于VC6.0的控制台作图--动画和双缓冲技术

    文章目录 让图形动起来 直接向屏幕作图 使用双缓冲技术 双缓冲技术编程原理 让图形动起来 让图形动起来的办法就是不断定时清屏.重绘.像放电影那样.然而,直接向屏幕绘图是耗时的,在屏幕上画很多线,将多次 ...

  6. VC绘图中的双缓冲技术

    VC绘图中的双缓冲技术 转自:VC 绘图,使用双缓冲技术实现 ********************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)******************* **** ...

  7. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:// ...

  8. 双缓冲(Double Buffer)原理和使用【转】

    转自:http://blog.csdn.net/acs713/article/details/16359551 原文出自:http://blog.csdn.net/xiaohui_hubei/arti ...

  9. java图片双缓存_Java 双缓冲技术消除图片闪动

    一般在使用Canvas组件刷新显示图片或者绘图的时候,会产生闪烁.这是由于机制是先使用背景色对原有内容进行覆盖,再往上面绘制新内容所引起的.我们看到的闪烁就是背景色和新内容之间的交替显示. 下面为Ca ...

最新文章

  1. 微型小乐器 : MicroSynth 小巧而优美
  2. 一起学android之怎样设置TextView中不同字段的字体颜色(22)
  3. 北斗导航 | C语言实现PPP(精密单点定位)
  4. CentOS学习笔记(一):中文语言包及输入法的安装使用
  5. 网页边框和网页文字阴影
  6. 前端传递给后端且通过cookie方式,尽量传递id
  7. UNIX环境高级编程——第一个程序
  8. Salesforce 知识点记录(JSZip在lighting中使用时遇到的坑)
  9. python爬虫实践-腾讯视频弹幕分析
  10. STM32F407 SPI线的选择
  11. asp微信扫码签到源码
  12. 基于Springboot健身会员俱乐部管理系统设计
  13. 接口性能测试方案 白皮书 V1.0
  14. 网站群发站内信数据库表设计
  15. 逆向工程实验_lab0(密码学算法逆向)
  16. Matlab函数fir1(n,Wn)中的归一化频率的含义
  17. 关于神经网络每次预测结果不一样的问题
  18. python在循环中创建dataframe(如df1、df2……)
  19. libco源码解析(2) 创建协程,co_create
  20. 什么是分布式配置中心?

热门文章

  1. php使用pdf2htmlex,转换 HTML 与 PDF 格式文档的神器
  2. centos 6.5 openldap php,centos6.5安装openldap+phpldapadmin
  3. python中curve fit_在python中拟合多变量curve_fit
  4. java调用julia脚本,Julia请求脚本中的用户输入
  5. java spring 服务器关闭连接_java springboot websocket 服务 服务器主动关闭连接 导致 抛出java.io.EOFException异常...
  6. pythonzip是迭代器_Python迭代器和zip
  7. 光谱分析软件_利用Tracker软件分析太阳光谱中辐射强度与波长的关系
  8. basic中next转为c语言,[转载]混乱c语言代码写的basic解释器
  9. 米10设置aac格式_Tipard Total Media Converter for Mac(全媒体格式转换器)
  10. arcgis python脚本筛选与线共边的面_ArcGis Python脚本——遍历输出面或折线要素的折点坐标...