双缓冲技术绘图原理及简单的VC实现
为了增加自己对双缓冲绘图技术的理解,简要做个笔记(以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实现相关推荐
- java双缓冲绘图_Java双缓冲技术-绘图应用
1屏幕产生闪烁的原因 由于在显示所绘制的图像时,调用了repaint方法.repaint方法被调用时,需要清除整个背景,然后才调用paint方法显示画面.这样,在清除背景和绘制图像的短暂时间间隔内被用 ...
- android 绘图 双缓存,Android开发之用双缓冲技术绘图
双缓冲技术主要用在画图,动画效果上.其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去. 双缓冲技术可以有效防止闪烁.提高显示质量. DrawView.java: package ...
- NET框架下使用双缓冲技术绘图
from http://bbs.nju.edu.cn/blogcon?userid=godwin&file=1178541360 本文主要介绍 .Net 框架的基本绘图技术.通过简要的介绍和示 ...
- (转).NET框架下使用双缓冲技术绘图
本文主要介绍 .Net 框架的基本绘图技术.通过简要的介绍和示例程序来探讨绘图技术的优势.劣势以及其它相关注意事项. 简介 幸运的是当编写一个典型的Windows 窗体程序时,窗体和控件的绘制.效果等 ...
- 基于VC6.0的控制台作图--动画和双缓冲技术
文章目录 让图形动起来 直接向屏幕作图 使用双缓冲技术 双缓冲技术编程原理 让图形动起来 让图形动起来的办法就是不断定时清屏.重绘.像放电影那样.然而,直接向屏幕绘图是耗时的,在屏幕上画很多线,将多次 ...
- VC绘图中的双缓冲技术
VC绘图中的双缓冲技术 转自:VC 绘图,使用双缓冲技术实现 ********************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)******************* **** ...
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:// ...
- 双缓冲(Double Buffer)原理和使用【转】
转自:http://blog.csdn.net/acs713/article/details/16359551 原文出自:http://blog.csdn.net/xiaohui_hubei/arti ...
- java图片双缓存_Java 双缓冲技术消除图片闪动
一般在使用Canvas组件刷新显示图片或者绘图的时候,会产生闪烁.这是由于机制是先使用背景色对原有内容进行覆盖,再往上面绘制新内容所引起的.我们看到的闪烁就是背景色和新内容之间的交替显示. 下面为Ca ...
最新文章
- 微型小乐器 : MicroSynth 小巧而优美
- 一起学android之怎样设置TextView中不同字段的字体颜色(22)
- 北斗导航 | C语言实现PPP(精密单点定位)
- CentOS学习笔记(一):中文语言包及输入法的安装使用
- 网页边框和网页文字阴影
- 前端传递给后端且通过cookie方式,尽量传递id
- UNIX环境高级编程——第一个程序
- Salesforce 知识点记录(JSZip在lighting中使用时遇到的坑)
- python爬虫实践-腾讯视频弹幕分析
- STM32F407 SPI线的选择
- asp微信扫码签到源码
- 基于Springboot健身会员俱乐部管理系统设计
- 接口性能测试方案 白皮书 V1.0
- 网站群发站内信数据库表设计
- 逆向工程实验_lab0(密码学算法逆向)
- Matlab函数fir1(n,Wn)中的归一化频率的含义
- 关于神经网络每次预测结果不一样的问题
- python在循环中创建dataframe(如df1、df2……)
- libco源码解析(2) 创建协程,co_create
- 什么是分布式配置中心?
热门文章
- php使用pdf2htmlex,转换 HTML 与 PDF 格式文档的神器
- centos 6.5 openldap php,centos6.5安装openldap+phpldapadmin
- python中curve fit_在python中拟合多变量curve_fit
- java调用julia脚本,Julia请求脚本中的用户输入
- java spring 服务器关闭连接_java springboot websocket 服务 服务器主动关闭连接 导致 抛出java.io.EOFException异常...
- pythonzip是迭代器_Python迭代器和zip
- 光谱分析软件_利用Tracker软件分析太阳光谱中辐射强度与波长的关系
- basic中next转为c语言,[转载]混乱c语言代码写的basic解释器
- 米10设置aac格式_Tipard Total Media Converter for Mac(全媒体格式转换器)
- arcgis python脚本筛选与线共边的面_ArcGis Python脚本——遍历输出面或折线要素的折点坐标...