陈灯wgf双缓冲绘图框架使用说明

上传人:E**** 文档编号:105076610 上传时间:2019-10-11 格式:PDF 页数:8 大小:178.26KB
返回 下载 相关 举报
陈灯wgf双缓冲绘图框架使用说明_第1页
第1页 / 共8页
陈灯wgf双缓冲绘图框架使用说明_第2页
第2页 / 共8页
陈灯wgf双缓冲绘图框架使用说明_第3页
第3页 / 共8页
陈灯wgf双缓冲绘图框架使用说明_第4页
第4页 / 共8页
陈灯wgf双缓冲绘图框架使用说明_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《陈灯wgf双缓冲绘图框架使用说明》由会员分享,可在线阅读,更多相关《陈灯wgf双缓冲绘图框架使用说明(8页珍藏版)》请在金锄头文库上搜索。

1、WGF 使用说明书 WGF 使用说明书 目 录目 录 1 WGF 介绍介绍 1 1.1 简介 1 1.2 开发环境. 1 1.3 产生背景. 1 1.4 工作内容. 2 1.5 特点 2 2 使用说明使用说明 . 3 2.1 目录结构说明. 3 2.2 环境配置. 4 2.3 开发方法. 5 3 其它其它. 5 3.1 例程说明. 5 3.2 版权说明. 6 3.3 联系作者. 6 1 1 WGF 介绍1 WGF 介绍 1.1 简介 WGF(windows graphic foundation)为 windows 下的 gdi 和 gdiplus 双缓冲绘图框架。 框架在 VC6.0 下使用

2、C+语言开发而成并以可扩展的 MFC 动态链接库形式提供,适用于 windows 操作系统。WGF 为完全开源的免费产品,可以用于任何商业的和非商业的用途。 WGF 设计的目的是对 windows 下的 gdi 和 gdiplus 双缓冲绘图进行封装和优化。WGF 封装了使用 gdi 和 gdiplus 进行双缓冲绘图的实现细节,使用框架进行双缓冲绘图时感觉 就像是在窗口上绘图一样。同时,WGF 通过将绘图内容划分为静态场景和动态场景以及通 过采用 gdi 和 gdiplus 混合绘图的方式对 windows 下的 gdi 和 gdiplus 绘图进行了优化。 1.2 开发环境 操作系统:wi

3、ndows 2000、windows xp 集成开发环境:VC6.0 开发语言:C+ 相关类库:MFC 1.3 产生背景 WGF 的产生主要是由于在使用 gdi 和 gdiplus 进行双缓冲绘图时存在着效率低下的问 题。 a) 双缓冲绘图潜在的效率问题 双缓冲刷新技术是一项解决刷屏时存在的屏幕闪烁问题的有效方法。这种方法通过将 图形绘制在与窗口设备上下文兼容的后备缓冲区中然后通过内存拷贝到前端缓冲区进行 显示的方式实现。双缓冲刷新技术通常在需要进行实时图形显示的情况下使用,因为屏幕 闪烁问题在高速刷新的情况下较为明显。如果将所有的绘图场景不加区分的在每一次刷新 时都进行重绘,双缓冲刷新技术是

4、低效的,但是这种状况可以通过引入一个与窗口设备上 下文兼容的内存静态设备描述表加入改进。通常情况下,绘图的场景可以划分为静态场景 和动态场景,静态场景是指位置和各种图形属性不随时间发生变化的场景,例如一个足球 场地;动态场景是指位置或者图形属性随时间发生变化的场景,例如足球场上的足球和运 动员。在采用双缓冲技术进行绘图时,可以通过对静态场景进行特殊处理以减少重绘时的 任务量,方法是在第一次进行屏幕刷新时将静态场景绘制在一个与窗口设备上下文兼容的 内存静态设备描述表中,在以后重绘时则不需要再次重新绘制静态场景而只需要将保存在 内存静态设备描述表中的静态场景拷贝到后备缓冲区中,然后再将动态场景直接

5、绘制在后 备缓冲区中,最后将整个后备缓冲内容拷贝到前端缓冲区完成整个双缓冲绘图过程。该方 法的原理是因为静态场景不会随着时间发生变化,因此不需要每一次刷新时都进行重绘, 而只需要在绘图区域的大小发生改变时重绘即可。使用这种方法的额外开销是引入了一个 2 内存静态设备描述表,但是这种开销所换取的效率在内存廉价的今天是微不足道的。 b) 效率低下的 gidplus Gdiplus 相对于 gdi 来说功能更为强大,主要表现在 gdiplus 支持矩阵操作并且 gdiplus 具有反锯齿的功能,可以绘制出相对平滑的曲线。但是强大的功能通常是需要代 价的,gdiplus 是直接使用 CPU 进行绘图,

6、使用 gdiplus 在开启反锯齿的情况下绘制简单 的几条曲线也会导致 CPU 占用率明显上升,因此通过区分静态场景和动态场景以减少重绘 时的 CPU 工作量在 gdiplus 绘图过程中具有更加重要的意义。但是不幸的是 gdiplus 中没 有 gdi 中位拷贝(BitBlt())那样快速高效的内存拷贝函数,相形之下有一个性能极其糟 糕的 DrawImage()函数。解决的办法是采用 gdi 和 gdiplus 混合编程,即采用 gdiplus 的 绘图函数将静态场景绘制到一个与 Graphics 绘图对象对应的内存静态设备描述表中, 然后 再使用 gdi 中的位拷贝方法进行内存拷贝。 1.

7、4 工作内容 WGF 通过一个导出类 CDBDraw 实现了对双缓冲绘图的封装和优化。 CDBDraw 是一个非常 简单的类,其只有 3 个导出的公有成员函数供外部进行调用,分别是初始化成员函数 (init()、 绘图成员函数(draw()和设置绘图区大小的成员函数(setRect()。 这 3 个函数 都是采用的_stdcall 函数调用约定,关于这些函数的详细说明请参考源码中的注释,对 于这些函数的使用方法请参考例程 RobotField2D。 CDBDraw 类实现了对双缓冲绘图的隐藏, 其在内部提供了保护类型的成员变量 m_pDC 和 m_pGC 分别用于 gdi 绘图和 gdiplu

8、s 绘图使 用(m_pDC 为一个 CDC 类对象,m_pGC 为一个 Graphics 类对象)。在使用 m_pDC 和 m_pGC 进行绘图时,图形实际上是被绘制在后备缓冲区中,但是 CDBDraw 类隐藏了双缓冲绘图中 内存拷贝的细节以及对绘图过程中的各类资源的释放都 CDBDraw 类进行了处理,用户可以 不用担心内存泄漏等问题。同时,CDBDraw 类在接口成员函数 Draw()中对静态场景和动态 场景进行了处理以提高绘图的性能。CDBDraw 类中 Draw()成员函数的执行流程见图 1。 1.5 特点 a) 轻量级库 WGF 仅由一个导出类 CDBDraw 和一个非导出类 CMe

9、mDC 组成,属于轻量级的库。 b) 易于使用 WGF 以动态链接库的形式提供,可以方便的被其他的语言使用。 c) 封装了双缓冲绘图细节 WGF 封装了双缓冲绘图的细节,用户只需要使用 CDBDraw 类中提供的成员变量 m_pDC 和 m_pGC 进行绘图, 至于与双缓冲有关的内存拷贝和各类资源的释放等细节均由框架完成。 d) 封装了 gdiplus 绘图的额外工作并为 gdi 和 gdiplus 混合绘图提供了便利 在 vc6.0 使用 gdiplus 进行绘图时需要进行一系列的额外工作,包括包含头文件、导 入库文件和 gdiplus 的启动(GdiplusStartup()和关闭(Gdi

10、plusShutdown()等。WGF 对 3 gdiplus 的这些工作进行了封装,使用 WGF 并不需要进行 gdiplus 的任何配置即可直接进 行 gdiplus 绘图。同时,CDBDraw 类中提供的 m_pDC 和 m_pGC 为 gdi 和 gdiplus 混合绘图 提供了便利。 e) 高效性 WGF 对静态场景和动态场景采用了不同的处理方式并通过 gdi 和 gdiplus 混合编程解 决了 gdiplus 中低效的内存拷贝问题,使得采用 WGF 进行绘图的效率得以提升。效率的提 升通过一个简单的试验可见一斑,即将 drawStaticScene()虚函数中的绘图代码拷贝到 d

11、rawDynamicScene()虚函数中,通过这一过程的前后对比发现拷贝后绘图程序的 CPU 占用 率明显上升。 开始 绘图区大小是否改变? 更新绘图对象包括CDC类对象 和Graphics类对象 调用prepareDraw()进行绘 图设置 调用drawStaticScene()将静态场 景绘制在内存静态设备描述表 中 True 将静态场景拷贝到后备 缓冲区 调用prepareDraw()进行绘 图设置 调用drawDynamicScene()将动态 场景绘制在后备缓冲区中 将会被缓冲区图像拷贝 到前端缓冲区 结束 False 图1绘图接口流程图 2 使用说明2 使用说明 2.1 目录结构

12、说明 工程目录下供包含 bin、doc、include、lib、samples 和 src 共 6 个文件夹。各文件 夹内容介绍如下: Bin:此目录下存放了 gdiplus 动态连库 gdiplus.dll 和生成的 WGF 动态链接库 WGF.dll(release)和WGFd.dll(debug)以及 samples 目录中的例程RobotField2D生成的可 执行文件 RobotField2D.exe(release)和 RobotField2Dd.exe(debug)。 Doc:该目录中存放了与 WGF 相关的文档。 Include:该目录为 WGF 的头文件,使用 WGF 库时需

13、要包含该目录中的头文件。 4 Lib:该目录中存放了 gdiplus 的 lib 文件 gdiplus.lib 和 WGF 生成的 lib 文件 WGF.lib(release)和 WGFd.lib(debug)。 Samples:该目录中存放了使用 WGF 进行绘图的例程 RobotField2D。 Src:该目录下包含了 WGF 源码的工程文件和代码实现文件。 另:在对代码编译过程中会生成一个临时文件夹 output,该目录下存放了编译、链接 过程中产生的中间文件,可以删除。 2.2 环境配置 使用该库前需要完成以下 2 项工作(以 vc6.0 为例): a) 包含 WGF 头文件 在 v

14、c6.0 中依次选择菜单项:工具(Tools)选项(Options)。在弹出的选项对话框中 选择目录(Directories)选项卡,在显示目录(Show directories for)下拉框中选择头文 件(Include files)并在目录(Directories)列表框中加入 WGF 的头文件所在的目录(如 e:WGFinclude)。Vc6.0 中选项对话框界面见图 2。 图2Vc6.0 中的选项对话框 完成以上设置后在工程的 StdAfx.h 文件的末尾加上如下语句: #include “WGF.h“/WGF 头文件 using namespace wgf;/使用 wgf 命名空间

15、 至此同文件的包含工作已经完成。 b) 拷贝 WGF 动态链接库文件到系统搜索目录下 方法一:将 WGF 动态链接库文件 WGF.dll(release)或者 WGFd.dll(debug)拷贝到操作 系统盘系统目录下,如 windows xp 操作系统安装在 C 盘,则该目录为 “C:WINDOWSsystem32”。 方法二:将 WGF 动态链接库文件 WGF.dll(release)或者 WGFd.dll(debug)拷贝到应用 5 程序可执行文件文件夹目录下, 如例程中的RobotField2D.exe与WGF.dll同在bin目录下。 方法三:在系统环境变量 path 中加入 WGF

16、 动态链接库文件所在的路径。 2.3 开发方法 在完成 WGF 的环境配置后便可以使用 WGF 导出的类 CDBDraw 进行绘图。方法为: 步骤一:从 CDBDraw 类派生出自己的绘图类(如 CMyDBDraw)。 步骤二:在派生的绘图类(如 CMyDBDraw)中重写虚函数 prepareDraw()、 drawStaticScene()和 drawDynamicScene()。 在 prepareDraw()加入相关绘图设置代码, 包 括 gdi 或者 gdiplus 中的坐标转换、映射模式等;在 drawStaticScene()加入静态场景的 绘图代码,该函数中的绘图代码只有通过 setRect()改变了绘图区域大小后才会被重新调 用,因此在窗口绘图区发生变化时应调用 setRect()更新绘图区域的大小和静态场景;在 drawDynamicScene()加入动态场景的绘图代码。在 drawStaticScene()和 drawDynamicScene()绘图时可以直接使用 CDBDraw 类的成员变量 m_pDC(CDC 类对象指针) 和 m

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号