APP下载

基于Qt绘图系统的图形应用优化研究与实现

2016-02-13邓子强王玉玫邓红艳

软件 2016年12期
关键词:图元图层绘图

邓子强,王玉玫,邓红艳,张 宇

(华北计算技术研究所 地理信息与图形图像研发中心,北京 100083)

基于Qt绘图系统的图形应用优化研究与实现

邓子强,王玉玫,邓红艳,张 宇

(华北计算技术研究所 地理信息与图形图像研发中心,北京 100083)

为了提高Qt绘图系统在存在大量图元时对图元操作的流畅性,减少卡顿现象,本文深入剖析了Qt绘图引擎的实现机制和效率,提出了多图层贴图和增加编辑图层的方案,将要绘制的图元分类后分别绘制到多个pixmap中,每一个pixmap表示一个图层,显示时把pixmap贴到屏幕上即可,刷新时只对有图元变化的图层进行重绘。为了验证该方案的有效性,本文实现了该方案并进行了测试,对测试结果进行了统计分析。

Qt;pixmap;图层;重绘

0 引言

绘图系统作为军用图形处理系统的基础,其图形绘制性能直接决定了军用图形处理系统的使用性。然而,如今战场环境错综复杂,对标绘系统的图元要求更加多样化,对需要大批量图元绘制的需求也随着增加,同时更加注重标绘系统的动态刷新效率和实时性要求。这对绘图系统来说是一个挑战,本文正是对绘图系统进行优化的一次尝试,为了满足绘图系统的跨平台需求,绘图系统采用了Qt图形绘制引擎[1],下文对图形系统的优化都是基于Qt图形绘制引擎的基础之上。

1 Qt绘图引擎

Qt采用基于虚拟缓存(FrameBuffer)[2]的物理绘图设备,为了加快绘制图形的速度,Qt中的每个客户端程序都可以直接访问虚拟缓存物理绘图设备,虚拟缓存物理设备是一块内存块,程序在虚拟缓存上绘制图像就相对于在屏幕上直接绘制。

Qt绘图系统主要由三部分组成,QPainter,QPaintDevice,QPaintEngine。QPainter是一个绘制接口类,提供绘制各种面向用户的命令,QPaintDevice是一个QPainter绘制的目的地,相当于画布,QPaintEngine是基本绘制命令的具体实现。QPainter提供了大部分基本二维几何图元的绘制命令,如drawLine()、drawRect()、drawEllipse()等,Qt也提供了一系列绘图命令来绘制pixmap和image等,例如drawPixmap()、drawImage()。

2 优化方案的设计与实现

在使用Qt进行图形绘制时,一般会在paintEvent()函数中使用drawLine()、drawEllipse()、drawPath()等绘图函数直接把图元绘制到屏幕上,在图元数量比较小的时候还可以接受,几乎感觉不到性能差异,一旦图元数量较多而且需要对图元进行移动、删除、修改属性等操作时,性能将会大幅度降低。因为每次刷新时不管有没有图元被修改都会导致所有图元重绘。

如果采用贴图的方式,先把所有图元绘制到pixmap上,再使用drawPixmap()函数进行贴图,在刷新时如果没有图元[3]被修改便可将原来的pixmap直接贴图,而不用把所有图元都再次重绘。而且可以采用多个图层,每个pixmap为一个图层,把需要绘制的图元分配到多个图层上,每个图层采用透明的方式,这样多个图层叠加的显示效果便和单个图层的效果一样。这样做的好处是可以使单个图层上的图元变化不会影响到其他图层,因为图层与图层之间是独立的,单个图层上图元的变动只会导致该图层上图元的重绘,对于其他没有图元变动的图层只需进行简单的贴图便可,从而提高刷新速度。优化方案结构图如下图2.1所示:

图2.1 优化方案结构图

图元划分:把需要显示的图元划分到n个图层(本文中一个图层即一个pixmap),图层的数量n视图元数量而定。划分方法可以有多种,如按图元类型进行划分、按图元的动静态属性进行划分。

图层叠加:图元显示时,把n个图层设置为透明,这样便可使所有pixmap上的图元都得到显示,不会被上面图层所遮挡。

图元操作:当对图元进行选中、移动等操作时,会先把图元移动到编辑图层并进行高亮显示,编辑图层[4]操作完成后再回写到所属图层。

2.1 图元类

为了方便测试,测试方案中使用的图元都是无填充的空心圆,图元类的属性包括圆心坐标(x,y)、图元路径(path)、图元标识(id)、线色(lineColor)、线宽(lineWidth)和是否为脏数据(isShapeDirty)。

其中

图元路径:是使用QPainterPath::addEllipse()添加的圆,添加时需传入圆的外接矩形的宽和高。

图元标识:是使用QUuid::createUuid()生成的唯一识别码。

是否为脏数据:当图元属性发生变化后会把isShapeDirty设为true。

2.2 图层类

图层类属性包括绘图设备(mpPixmap)、图层标识(id)、图元容器(hashShape)[5]以及是否为脏图层(isLayerDirty)等。其中

绘图设备:mpPixmap的宽和高都是在创建图层时传入,且被设置为透明。

图层标识:是使用QUuid::createUuid()生成的唯一识别码。

图元容器:采用QHash保存图元,可以提高检索速度。

是否为脏图层:当图层上有图元被修改比如移动、删除等操作时,isLayerDirty会被设为true。

2.3 图元管理

为了测试优化方案中图元的动态刷新[6]时间,方案中实现了图元的选中、移动、和删除等操作。可以设置图元的颜色、线宽、是否反走样等属性。

(1)图元的刷新:图元类BaseShape设有isShapeDirty标识,当图元信息如坐标等发生改变时会被置为true,在刷新时图层会对每个图元进行遍历,判断该图层是否有图元发生变化。图层类GLayer设有isLayerDirty标识,当对图层进行addShape()和delShape()等对图层信息进行变更的操作时会把isLayerDirty置为true。刷新时,会对图层的标志位进行判断,如果图层没有发生变化则使用drawPixmap()函数对原有的pixmap进行贴图,如果发生变化,则把pixmap擦除后重新绘制该图层的所有图元到该pixmap,然后进行贴图。每次刷新后isLayerDirty将会被置为false。

(2)图元的拾取:设置setMouseTracking(true)之后mouseMoveEvent(QMouseEvent * event)函数会实时的跟踪鼠标状态,每当鼠标移动时该函数会检测当前鼠标位置是否存在图元,方法是遍历所有图层的hitTest()方法,图层的hitTest()方法再遍历图层中每个图元的hitTest()方法判断鼠标位置是否落在图元内。如果检测到鼠标有落在图元上则在编辑图层hoverLayer的相同位置绘制高亮显示的图元。之所以会利用编辑图层作高亮显示[7]是为了避免整个图层的刷新重绘从而提高重绘效率。

(3)图元的拖动:当拾取到某个图元后按下鼠标左键移动鼠标便可对图元进行拖动,当拾取到图元并按下鼠标左键开始移动时会把该图元从所对应的图层中删除,并在编辑图层中绘制高亮的图元,编辑图层中的高亮图元会随鼠标的移动而移动,当鼠标左键释放时该图元会重新被加入到它所属的原始图层,从而达到了图元移动的操作。

(4)图元的删除:当拾取到某个图元后,按下delete键可以对图元进行删除操作,删除时会把该图元从所属的图层移除,并且会把编辑图层的高亮显示擦除掉。

优化方案的运行结果如下图2.2所示:

图2.2 运行结果图

3 性能测试与分析

测试环境:中标麒麟3.2.1,内存:4G,处理器:i7 2.93 GHZ,显卡:NVIDIA GeForce9800 GT。

绘制内容:圆形(直径50像素,线宽2像素,反走样[7]),绘制窗口[8]大小:1024*768。

表2-1是当图元数目为20000个的时候测试所得数据,时间单位统一为毫秒(ms)。

表2-2是当图元数目为100000个的时候测试所得数据,时间单位统一为毫秒(ms)。

表2-3是当图元数目为200000个的时候测试所得数据,时间单位统一为毫秒(ms)。

表2-1

表2-2

表2-3

从表2-1、2-2、2-3中可以得出一些结论:

随着图层的增多启动时间[9]呈现增大的趋势,因为图层的初始化和管理需要花费部分时间,当图层数目超过50个且图元数目超过100000时启动时间大大增加。

当图层增加时,图元的拾取时间有稍许增加,但因为拾取时间都只有几十毫秒,对用户来说基本不会有影响。

对于图元的移动刷新时间和删除时间,从表中可以看出大致呈增长的趋势,尤其是在图层为1增加到图层为10的时候,刷新效率成倍数提高。

该论文提高绘图性能的两个关键点:

(1)采用了多个图层和贴图的方式,单个图层的变化对其他图层没有影响,对于没有变化的图层只需进行简单贴图便可,不用再对无变化图层的所有图元进行重绘,大大提高了重绘效率,减少了刷新时间。

(2)采用了编辑图层,在图元的拾取和图元的移动时,编辑图层起了重要作用。图元拾取时需要对拾取到的图元进行高亮显示,如果是在原有图层上进行高亮显示则需要对原有图层上所有的图元进行重绘,势必会降低效率。在图元移动时,如果是在原有图层上进行图元的坐标移动,则原有图层上所有图元都将进行重绘,伴随着鼠标移动带来的高频率刷新会使得刷新效率骤然下降,当图层上图元较多时会导致图元跟不上鼠标移动而出现卡顿甚至死机现象。

4 结语

本文介绍了Qt的绘图系统,然后提出了基于多图层的贴图方式和采用编辑图层的方案,为了证明该方案的确实可行且有效,本文实现了该方案并进行了测试,测试结果表明该方案对大批量图元的动态刷新有明显的效果。在标绘系统中,会存在显示大批量图元的的情况,甚至既有动目标[10]也有静目标[11],我们可以把动目标单独放在一层,这样即使动目标刷新也不会影响到静目标。

[1] AlanEzust, PaulEzust, An Introduetion to Design Patterns in C++ with Qt4, 2007.

[2] C++ GUI Programming with Qt3, Jasmin Blanchette, Mark Summerfield, Prentice Hall PTR, an.,2004.

[3] Jasmin Blanchette, Mark Summerfield C++ GUI Programming with Qt 4 [M]. Prentice Hall Jun 26, 2006.

[4] 罗喆. 基于COM技术的智能标绘系统的设计与实现重庆大学. 2012.04.

[5] 徐睿, 韦璐. 基于QT的数字逻辑虚拟实验平台设计[J].软件, 2016, 37(01): 101-104.

[6] 张燕燕, 胡毓钜. 地图可视化[J]. 测绘工程, 2001, 10(1): 27-29.

[7] 张春艳, 基于Qt的嵌入式图形用户界面研究与实现, 2008,大连, 大连海事大学.

[8] 何建仓, 侯泽民. 嵌入式Qt环境下绘图软件的设计与实现[J]. 软件, 2014, 35(5): 45-47.

[9] 别军象. 嵌入式GIS矢量图形标绘的研究西安工业大学. 2014.

[10] 李慧玲, 张俊霞. 计算机图形图像处理与制作专业教学改革分析[J]. 软件. 2014(02)

[11] 张晓清, 龚波, 田丽韫, 等. 国产自主可控应用性能优化研究[J]. 软件, 2015, 36(2): 5-9.

Research and Realization of Graphics Application Optimization Based on Qt Painting System

DENG Zi-qiang, WANG Yu-mei, DENG Hong-yan, ZHANG Yu (Geographic information and graphics technology research Center, North China Institute of Computing Technology, Beijing 100083, China)

In order to improve the smoothness of Qt painting system and reduce the phenomenon of Caton in the presence of a large number of elements, this paper deeply analyzes the mechanism and efficiency of Qt painting engine, and propose a solution that adopt multi-layer mapping and adding a editing-layer. Elements will be drawn to multiple pixmap after classification, each pixmap is a layer, therefore, we can paste the pixmap to screen when displayed, and we can only repaint the layer which elements were changed when refresh screen. In order to verify the effectiveness of this solution, this paper implements and tests the solution, and the test results were statistically analyzed.

Qt; Pixmap; Layer; Repaint

TP311

ADOI:10.3969/j.issn.1003-6970.2016.12.014

邓子强(1991-),男,硕士研究生,研究方向:计算机图形应用;王玉玫,女,研究员级高级工程师,研究方向:计算机图形图像处理及应用技术;邓红艳,教授,空军指挥学院,研究方向:模拟仿真专业;张宇,工程师,中国电子设备系统工程公司研究所,研究方向:指挥自动化专业。

本文著录格式:邓子强,王玉玫. 基于Qt绘图系统的图形应用优化研究与实现[J]. 软件,2016,37(12):59-62

猜你喜欢

图元图层绘图
来自河流的你
“禾下乘凉图”绘图人
一种组态控件技术在电力监控系统中的运用
学术出版物插图的编排要求(一):图注
联锁表自动生成软件的设计与实现
基于HTML5 Canvas绘图技术应用
巧用混合图层 制作抽象动感森林
图层法在地理区域图读图中的应用
跟我学添加真实的光照效果
Surfer和ArcView结合在气象绘图中的应用