鄧子強(qiáng),王玉玫,鄧紅艷,張 宇
(華北計(jì)算技術(shù)研究所 地理信息與圖形圖像研發(fā)中心,北京 100083)
基于Qt繪圖系統(tǒng)的圖形應(yīng)用優(yōu)化研究與實(shí)現(xiàn)
鄧子強(qiáng),王玉玫,鄧紅艷,張 宇
(華北計(jì)算技術(shù)研究所 地理信息與圖形圖像研發(fā)中心,北京 100083)
為了提高Qt繪圖系統(tǒng)在存在大量圖元時(shí)對(duì)圖元操作的流暢性,減少卡頓現(xiàn)象,本文深入剖析了Qt繪圖引擎的實(shí)現(xiàn)機(jī)制和效率,提出了多圖層貼圖和增加編輯圖層的方案,將要繪制的圖元分類后分別繪制到多個(gè)pixmap中,每一個(gè)pixmap表示一個(gè)圖層,顯示時(shí)把pixmap貼到屏幕上即可,刷新時(shí)只對(duì)有圖元變化的圖層進(jìn)行重繪。為了驗(yàn)證該方案的有效性,本文實(shí)現(xiàn)了該方案并進(jìn)行了測(cè)試,對(duì)測(cè)試結(jié)果進(jìn)行了統(tǒng)計(jì)分析。
Qt;pixmap;圖層;重繪
繪圖系統(tǒng)作為軍用圖形處理系統(tǒng)的基礎(chǔ),其圖形繪制性能直接決定了軍用圖形處理系統(tǒng)的使用性。然而,如今戰(zhàn)場(chǎng)環(huán)境錯(cuò)綜復(fù)雜,對(duì)標(biāo)繪系統(tǒng)的圖元要求更加多樣化,對(duì)需要大批量圖元繪制的需求也隨著增加,同時(shí)更加注重標(biāo)繪系統(tǒng)的動(dòng)態(tài)刷新效率和實(shí)時(shí)性要求。這對(duì)繪圖系統(tǒng)來(lái)說(shuō)是一個(gè)挑戰(zhàn),本文正是對(duì)繪圖系統(tǒng)進(jìn)行優(yōu)化的一次嘗試,為了滿足繪圖系統(tǒng)的跨平臺(tái)需求,繪圖系統(tǒng)采用了Qt圖形繪制引擎[1],下文對(duì)圖形系統(tǒng)的優(yōu)化都是基于Qt圖形繪制引擎的基礎(chǔ)之上。
Qt采用基于虛擬緩存(FrameBuffer)[2]的物理繪圖設(shè)備,為了加快繪制圖形的速度,Qt中的每個(gè)客戶端程序都可以直接訪問(wèn)虛擬緩存物理繪圖設(shè)備,虛擬緩存物理設(shè)備是一塊內(nèi)存塊,程序在虛擬緩存上繪制圖像就相對(duì)于在屏幕上直接繪制。
Qt繪圖系統(tǒng)主要由三部分組成,QPainter,QPaintDevice,QPaintEngine。QPainter是一個(gè)繪制接口類,提供繪制各種面向用戶的命令,QPaintDevice是一個(gè)QPainter繪制的目的地,相當(dāng)于畫布,QPaintEngine是基本繪制命令的具體實(shí)現(xiàn)。QPainter提供了大部分基本二維幾何圖元的繪制命令,如drawLine()、drawRect()、drawEllipse()等,Qt也提供了一系列繪圖命令來(lái)繪制pixmap和image等,例如drawPixmap()、drawImage()。
在使用Qt進(jìn)行圖形繪制時(shí),一般會(huì)在paintEvent()函數(shù)中使用drawLine()、drawEllipse()、drawPath()等繪圖函數(shù)直接把圖元繪制到屏幕上,在圖元數(shù)量比較小的時(shí)候還可以接受,幾乎感覺(jué)不到性能差異,一旦圖元數(shù)量較多而且需要對(duì)圖元進(jìn)行移動(dòng)、刪除、修改屬性等操作時(shí),性能將會(huì)大幅度降低。因?yàn)槊看嗡⑿聲r(shí)不管有沒(méi)有圖元被修改都會(huì)導(dǎo)致所有圖元重繪。
如果采用貼圖的方式,先把所有圖元繪制到pixmap上,再使用drawPixmap()函數(shù)進(jìn)行貼圖,在刷新時(shí)如果沒(méi)有圖元[3]被修改便可將原來(lái)的pixmap直接貼圖,而不用把所有圖元都再次重繪。而且可以采用多個(gè)圖層,每個(gè)pixmap為一個(gè)圖層,把需要繪制的圖元分配到多個(gè)圖層上,每個(gè)圖層采用透明的方式,這樣多個(gè)圖層疊加的顯示效果便和單個(gè)圖層的效果一樣。這樣做的好處是可以使單個(gè)圖層上的圖元變化不會(huì)影響到其他圖層,因?yàn)閳D層與圖層之間是獨(dú)立的,單個(gè)圖層上圖元的變動(dòng)只會(huì)導(dǎo)致該圖層上圖元的重繪,對(duì)于其他沒(méi)有圖元變動(dòng)的圖層只需進(jìn)行簡(jiǎn)單的貼圖便可,從而提高刷新速度。優(yōu)化方案結(jié)構(gòu)圖如下圖2.1所示:
圖2.1 優(yōu)化方案結(jié)構(gòu)圖
圖元?jiǎng)澐郑喊研枰@示的圖元?jiǎng)澐值絥個(gè)圖層(本文中一個(gè)圖層即一個(gè)pixmap),圖層的數(shù)量n視圖元數(shù)量而定。劃分方法可以有多種,如按圖元類型進(jìn)行劃分、按圖元的動(dòng)靜態(tài)屬性進(jìn)行劃分。
圖層疊加:圖元顯示時(shí),把n個(gè)圖層設(shè)置為透明,這樣便可使所有pixmap上的圖元都得到顯示,不會(huì)被上面圖層所遮擋。
圖元操作:當(dāng)對(duì)圖元進(jìn)行選中、移動(dòng)等操作時(shí),會(huì)先把圖元移動(dòng)到編輯圖層并進(jìn)行高亮顯示,編輯圖層[4]操作完成后再回寫到所屬圖層。
2.1 圖元類
為了方便測(cè)試,測(cè)試方案中使用的圖元都是無(wú)填充的空心圓,圖元類的屬性包括圓心坐標(biāo)(x,y)、圖元路徑(path)、圖元標(biāo)識(shí)(id)、線色(lineColor)、線寬(lineWidth)和是否為臟數(shù)據(jù)(isShapeDirty)。
其中
圖元路徑:是使用QPainterPath::addEllipse()添加的圓,添加時(shí)需傳入圓的外接矩形的寬和高。
圖元標(biāo)識(shí):是使用QUuid::createUuid()生成的唯一識(shí)別碼。
是否為臟數(shù)據(jù):當(dāng)圖元屬性發(fā)生變化后會(huì)把isShapeDirty設(shè)為true。
2.2 圖層類
圖層類屬性包括繪圖設(shè)備(mpPixmap)、圖層標(biāo)識(shí)(id)、圖元容器(hashShape)[5]以及是否為臟圖層(isLayerDirty)等。其中
繪圖設(shè)備:mpPixmap的寬和高都是在創(chuàng)建圖層時(shí)傳入,且被設(shè)置為透明。
圖層標(biāo)識(shí):是使用QUuid::createUuid()生成的唯一識(shí)別碼。
圖元容器:采用QHash
是否為臟圖層:當(dāng)圖層上有圖元被修改比如移動(dòng)、刪除等操作時(shí),isLayerDirty會(huì)被設(shè)為true。
2.3 圖元管理
為了測(cè)試優(yōu)化方案中圖元的動(dòng)態(tài)刷新[6]時(shí)間,方案中實(shí)現(xiàn)了圖元的選中、移動(dòng)、和刪除等操作??梢栽O(shè)置圖元的顏色、線寬、是否反走樣等屬性。
(1)圖元的刷新:圖元類BaseShape設(shè)有isShapeDirty標(biāo)識(shí),當(dāng)圖元信息如坐標(biāo)等發(fā)生改變時(shí)會(huì)被置為true,在刷新時(shí)圖層會(huì)對(duì)每個(gè)圖元進(jìn)行遍歷,判斷該圖層是否有圖元發(fā)生變化。圖層類GLayer設(shè)有isLayerDirty標(biāo)識(shí),當(dāng)對(duì)圖層進(jìn)行addShape()和delShape()等對(duì)圖層信息進(jìn)行變更的操作時(shí)會(huì)把isLayerDirty置為true。刷新時(shí),會(huì)對(duì)圖層的標(biāo)志位進(jìn)行判斷,如果圖層沒(méi)有發(fā)生變化則使用drawPixmap()函數(shù)對(duì)原有的pixmap進(jìn)行貼圖,如果發(fā)生變化,則把pixmap擦除后重新繪制該圖層的所有圖元到該pixmap,然后進(jìn)行貼圖。每次刷新后isLayerDirty將會(huì)被置為false。
(2)圖元的拾?。涸O(shè)置setMouseTracking(true)之后mouseMoveEvent(QMouseEvent * event)函數(shù)會(huì)實(shí)時(shí)的跟蹤鼠標(biāo)狀態(tài),每當(dāng)鼠標(biāo)移動(dòng)時(shí)該函數(shù)會(huì)檢測(cè)當(dāng)前鼠標(biāo)位置是否存在圖元,方法是遍歷所有圖層的hitTest()方法,圖層的hitTest()方法再遍歷圖層中每個(gè)圖元的hitTest()方法判斷鼠標(biāo)位置是否落在圖元內(nèi)。如果檢測(cè)到鼠標(biāo)有落在圖元上則在編輯圖層hoverLayer的相同位置繪制高亮顯示的圖元。之所以會(huì)利用編輯圖層作高亮顯示[7]是為了避免整個(gè)圖層的刷新重繪從而提高重繪效率。
(3)圖元的拖動(dòng):當(dāng)拾取到某個(gè)圖元后按下鼠標(biāo)左鍵移動(dòng)鼠標(biāo)便可對(duì)圖元進(jìn)行拖動(dòng),當(dāng)拾取到圖元并按下鼠標(biāo)左鍵開(kāi)始移動(dòng)時(shí)會(huì)把該圖元從所對(duì)應(yīng)的圖層中刪除,并在編輯圖層中繪制高亮的圖元,編輯圖層中的高亮圖元會(huì)隨鼠標(biāo)的移動(dòng)而移動(dòng),當(dāng)鼠標(biāo)左鍵釋放時(shí)該圖元會(huì)重新被加入到它所屬的原始圖層,從而達(dá)到了圖元移動(dòng)的操作。
(4)圖元的刪除:當(dāng)拾取到某個(gè)圖元后,按下delete鍵可以對(duì)圖元進(jìn)行刪除操作,刪除時(shí)會(huì)把該圖元從所屬的圖層移除,并且會(huì)把編輯圖層的高亮顯示擦除掉。
優(yōu)化方案的運(yùn)行結(jié)果如下圖2.2所示:
圖2.2 運(yùn)行結(jié)果圖
測(cè)試環(huán)境:中標(biāo)麒麟3.2.1,內(nèi)存:4G,處理器:i7 2.93 GHZ,顯卡:NVIDIA GeForce9800 GT。
繪制內(nèi)容:圓形(直徑50像素,線寬2像素,反走樣[7]),繪制窗口[8]大小:1024*768。
表2-1是當(dāng)圖元數(shù)目為20000個(gè)的時(shí)候測(cè)試所得數(shù)據(jù),時(shí)間單位統(tǒng)一為毫秒(ms)。
表2-2是當(dāng)圖元數(shù)目為100000個(gè)的時(shí)候測(cè)試所得數(shù)據(jù),時(shí)間單位統(tǒng)一為毫秒(ms)。
表2-3是當(dāng)圖元數(shù)目為200000個(gè)的時(shí)候測(cè)試所得數(shù)據(jù),時(shí)間單位統(tǒng)一為毫秒(ms)。
表2-1
表2-2
表2-3
從表2-1、2-2、2-3中可以得出一些結(jié)論:
隨著圖層的增多啟動(dòng)時(shí)間[9]呈現(xiàn)增大的趨勢(shì),因?yàn)閳D層的初始化和管理需要花費(fèi)部分時(shí)間,當(dāng)圖層數(shù)目超過(guò)50個(gè)且圖元數(shù)目超過(guò)100000時(shí)啟動(dòng)時(shí)間大大增加。
當(dāng)圖層增加時(shí),圖元的拾取時(shí)間有稍許增加,但因?yàn)槭叭r(shí)間都只有幾十毫秒,對(duì)用戶來(lái)說(shuō)基本不會(huì)有影響。
對(duì)于圖元的移動(dòng)刷新時(shí)間和刪除時(shí)間,從表中可以看出大致呈增長(zhǎng)的趨勢(shì),尤其是在圖層為1增加到圖層為10的時(shí)候,刷新效率成倍數(shù)提高。
該論文提高繪圖性能的兩個(gè)關(guān)鍵點(diǎn):
(1)采用了多個(gè)圖層和貼圖的方式,單個(gè)圖層的變化對(duì)其他圖層沒(méi)有影響,對(duì)于沒(méi)有變化的圖層只需進(jìn)行簡(jiǎn)單貼圖便可,不用再對(duì)無(wú)變化圖層的所有圖元進(jìn)行重繪,大大提高了重繪效率,減少了刷新時(shí)間。
(2)采用了編輯圖層,在圖元的拾取和圖元的移動(dòng)時(shí),編輯圖層起了重要作用。圖元拾取時(shí)需要對(duì)拾取到的圖元進(jìn)行高亮顯示,如果是在原有圖層上進(jìn)行高亮顯示則需要對(duì)原有圖層上所有的圖元進(jìn)行重繪,勢(shì)必會(huì)降低效率。在圖元移動(dòng)時(shí),如果是在原有圖層上進(jìn)行圖元的坐標(biāo)移動(dòng),則原有圖層上所有圖元都將進(jìn)行重繪,伴隨著鼠標(biāo)移動(dòng)帶來(lái)的高頻率刷新會(huì)使得刷新效率驟然下降,當(dāng)圖層上圖元較多時(shí)會(huì)導(dǎo)致圖元跟不上鼠標(biāo)移動(dòng)而出現(xiàn)卡頓甚至死機(jī)現(xiàn)象。
本文介紹了Qt的繪圖系統(tǒng),然后提出了基于多圖層的貼圖方式和采用編輯圖層的方案,為了證明該方案的確實(shí)可行且有效,本文實(shí)現(xiàn)了該方案并進(jìn)行了測(cè)試,測(cè)試結(jié)果表明該方案對(duì)大批量圖元的動(dòng)態(tài)刷新有明顯的效果。在標(biāo)繪系統(tǒng)中,會(huì)存在顯示大批量圖元的的情況,甚至既有動(dòng)目標(biāo)[10]也有靜目標(biāo)[11],我們可以把動(dòng)目標(biāo)單獨(dú)放在一層,這樣即使動(dòng)目標(biāo)刷新也不會(huì)影響到靜目標(biāo)。
[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技術(shù)的智能標(biāo)繪系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)重慶大學(xué). 2012.04.
[5] 徐睿, 韋璐. 基于QT的數(shù)字邏輯虛擬實(shí)驗(yàn)平臺(tái)設(shè)計(jì)[J].軟件, 2016, 37(01): 101-104.
[6] 張燕燕, 胡毓鉅. 地圖可視化[J]. 測(cè)繪工程, 2001, 10(1): 27-29.
[7] 張春艷, 基于Qt的嵌入式圖形用戶界面研究與實(shí)現(xiàn), 2008,大連, 大連海事大學(xué).
[8] 何建倉(cāng), 侯澤民. 嵌入式Qt環(huán)境下繪圖軟件的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件, 2014, 35(5): 45-47.
[9] 別軍象. 嵌入式GIS矢量圖形標(biāo)繪的研究西安工業(yè)大學(xué). 2014.
[10] 李慧玲, 張俊霞. 計(jì)算機(jī)圖形圖像處理與制作專業(yè)教學(xué)改革分析[J]. 軟件. 2014(02)
[11] 張曉清, 龔波, 田麗韞, 等. 國(guó)產(chǎn)自主可控應(yīng)用性能優(yōu)化研究[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
鄧子強(qiáng)(1991-),男,碩士研究生,研究方向:計(jì)算機(jī)圖形應(yīng)用;王玉玫,女,研究員級(jí)高級(jí)工程師,研究方向:計(jì)算機(jī)圖形圖像處理及應(yīng)用技術(shù);鄧紅艷,教授,空軍指揮學(xué)院,研究方向:模擬仿真專業(yè);張宇,工程師,中國(guó)電子設(shè)備系統(tǒng)工程公司研究所,研究方向:指揮自動(dòng)化專業(yè)。
本文著錄格式:鄧子強(qiáng),王玉玫. 基于Qt繪圖系統(tǒng)的圖形應(yīng)用優(yōu)化研究與實(shí)現(xiàn)[J]. 軟件,2016,37(12):59-62