双缓冲技术绘图原理及简单的VC实现
2023-09-11 14:16:45 时间
为了增加自己对双缓冲绘图技术的理解,简要做个笔记(以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);
相关文章
- 【华为云技术分享】【论文阅读】增量学习近期进展及未来趋势预测
- 【华为云技术分享】【测试微课堂】测试金字塔和持续自动化测试
- 【华为云技术分享】打卡APIG服务专享版,打造全栈API治理方案
- 区块链学习笔记:DAY01 区块链的技术原理
- PHP技术栈
- EasyNVR无插件流媒体服务器前端技术防止重复提交的方法
- Atitit 信息安全体系 资料书籍表 1. 《信息安全原理与技术2 1.1. 第2章 工具箱: 鉴别、 访问控制与加密2 1.2. 第3章 程序和编程 漏洞 木马 病毒3 1.3. We
- 1.1. 鼠标取词 屏幕取词技术实现原理
- Atitit.gui api自动化调用技术原理与实践
- Atitit.log日志技术的最佳实践attilax总结
- CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)
- 视频千倍压缩背后的技术原理之预测技术
- 技术实践丨列存表并发更新时的锁等待问题原理
- 技术实践丨GaussDB(DWS)运维管理功能“升级”的原理和使用
- 【华为云技术分享】华为专家亲述:如何转型搞 AI?
- 【华为云技术分享】云图说 | 云硬盘还可以共享?!不了解你就out了
- 【ChatGPT】揭秘:ChatGPT 系统架构技术栈
- 操作系统架构原理-资源管理技术与进程的抽象设计
- PostgreSQL的学习心得和知识总结(六十一)|深入理解PostgreSQL数据库 开源扩展tablefunc实现层次查询connectby函数 的原理技术
- IT:前端进阶技术路线图(初级→中级→高级)之初级(研发工具/HTML/CSS/JS/浏览器)/中级(研发链路/工程化/库/框架/性能优化/工作原理)/高级(搭建/中后台/体验管理等)之详细攻略
- 异步通信技术AJAX | 原理剖析、发送Ajax请求四步
- 华为堆叠技术讲解
- 回声消除技术原理与解决办法