国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Qt/Embedded的圖形硬加速方法研究與實(shí)現(xiàn)

2018-06-20 07:46:08凱,寧鈺,周
關(guān)鍵詞:矩形嵌入式繪制

王 凱,寧 鈺,周 威

(江南計(jì)算技術(shù)研究所第三處,江蘇 無(wú)錫 214083)

0 引 言

嵌入式系統(tǒng)是一種“完全嵌入受控器件內(nèi)部,為特定應(yīng)用而設(shè)計(jì)的專用計(jì)算機(jī)系統(tǒng)”,在電子產(chǎn)品集成度越來越高的今天,廣泛應(yīng)用于工業(yè)生產(chǎn)和生活的各個(gè)方面。全球生產(chǎn)的CPU(中央處理器),超過80%應(yīng)用于各類嵌入式系統(tǒng)。隨著嵌入式系統(tǒng)的日益發(fā)展,嵌入式處理器運(yùn)算能力的不斷增強(qiáng),越來越多的嵌入式設(shè)備開始采用較為復(fù)雜的GUI系統(tǒng),嵌入式設(shè)備的GUI系統(tǒng)發(fā)展得十分迅速[1]。傳統(tǒng)的嵌入式GUI系統(tǒng),如Microwindows等,由于項(xiàng)目規(guī)模較小,功能較薄弱,缺乏第三方支持等諸多原因,已經(jīng)越來越不能滿足用戶的需要。

Qt/Embedded是著名的Qt庫(kù)開發(fā)商Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt版本。Qt/Embedded與X11版本的Qt接口在最大程度上兼容,大部分基于Qt的X-Window程序移植到Qt/Embedded是非常方便的。Qt/Embedded延續(xù)了在X-Window上的強(qiáng)大功能[2-3]。Qt/Embedded類庫(kù)完全采用C++封裝,豐富的控件資源和較好的可移植性是Qt/Embedded最為優(yōu)秀的特點(diǎn)。Qt是完全面向?qū)ο蟮?易擴(kuò)展,并且允許真正的組件編程。使用X-Window下的開發(fā)工具Qt Creator可以直接開發(fā)基于Qt/Embedded的UI(用戶操作接口)界面。采用Qt/Embedded開發(fā)嵌入式Linux下的應(yīng)用軟件的第三方公司也日益增加。

文中分析了Qt/Embedded的體系結(jié)構(gòu)和底層支持的方式,闡述了Qt/Embedded圖形事件服務(wù)的源碼和架構(gòu)原理,通過結(jié)合幀緩沖驅(qū)動(dòng)體系與Qt/Embedded圖形引擎,對(duì)在嵌入式系統(tǒng)下如何實(shí)現(xiàn)圖形硬件加速進(jìn)行了詳細(xì)的研究和實(shí)現(xiàn)。

1 Qt/Embedded底層支持分析

1.1 Qt/Embedded的體系結(jié)構(gòu)

Qt/Embedded庫(kù)是Qt圖形界面庫(kù)的嵌入式版本,為了適應(yīng)嵌入式操作系統(tǒng)環(huán)境,做出了許多改動(dòng)和調(diào)整。它放棄了原本使用的X11也就是X Window體系去構(gòu)建GUI環(huán)境,因此也就不需要使用較大的Xlib庫(kù),所以內(nèi)存占用十分小,能夠適應(yīng)嵌入式開發(fā)的需求。在放棄了X Window體系之后,Qt/Embedded庫(kù)底層使用幀緩沖體系作為底層圖形接口,并使用輸入事件作為具體的輸入設(shè)備的抽象[4],比如keyboard和mouse等。在上層,Qt/Embedded庫(kù)繼續(xù)使用原本的Qt架構(gòu),從而保證用戶使用的便利性和一致性,并能夠與X Window系統(tǒng)下的程序兼容,使得用戶可以方便地進(jìn)行程序移植。

Qt/Embedded圖形引擎的基礎(chǔ)是圖形幀緩沖體系(framebuffer),它是一種采用mmap系統(tǒng)調(diào)用的驅(qū)動(dòng)接口,正是依靠幀緩沖驅(qū)動(dòng),屏幕才能顯示內(nèi)容,幀緩沖驅(qū)動(dòng)為上層QWS Server提供圖形支持,同時(shí)也為下層操作系統(tǒng)提供對(duì)圖形事件訪問服務(wù)的接口[5]。

1.2 Qt/Embedded的圖形引擎架構(gòu)

Qt/Embedded的GUI系統(tǒng)采用了C/S結(jié)構(gòu),每個(gè)獨(dú)立的Qt/Embedded程序都允許作為系統(tǒng)中唯一的一個(gè)GUI Server存在。在應(yīng)用程序首次以系統(tǒng)GUI Server的方式加載時(shí),將創(chuàng)建QWS Server實(shí)體。QWS Server創(chuàng)建底層顯示設(shè)備抽象基類QScreen,其中聲明了對(duì)于顯示設(shè)備的基本描述和操作方式,如打開、關(guān)閉、獲得顯示能力、創(chuàng)建GFX操作對(duì)象等等[6]。同時(shí),QWS Server調(diào)用QWSServer::openDisplay()函數(shù)創(chuàng)建窗體,在窗體創(chuàng)建過程中調(diào)用QWSServer::Data::Init()進(jìn)行初始化工作,之后創(chuàng)建Qt/Embedded的圖形引擎中幀緩沖驅(qū)動(dòng)類QLinuxFbScreen的實(shí)體對(duì)象,在QLinuxFbScreen對(duì)象中獲取設(shè)置QScreen關(guān)鍵指針qt_screen的信息并調(diào)用connect()打開幀緩沖體系中的抽象顯示設(shè)備(dev/fb0)。在QWSServer中所有對(duì)顯示設(shè)備的調(diào)用都由qt_screen發(fā)起[7]。

至此,完成了Qt/Embedded中圖形引擎的創(chuàng)建,并通過Qt/Embedded的圖形引擎中的幀緩沖驅(qū)動(dòng)類與系統(tǒng)幀緩沖驅(qū)動(dòng)直接相關(guān)聯(lián),由系統(tǒng)幀緩沖驅(qū)動(dòng)提供進(jìn)一步的支持。

2 幀緩沖驅(qū)動(dòng)體系結(jié)構(gòu)

2.1 幀緩沖驅(qū)動(dòng)顯示原理

幀緩沖(framebuffer)是Linux系統(tǒng)的顯示設(shè)備驅(qū)動(dòng)接口,Linux系統(tǒng)通過它屏蔽不同圖形硬件的底層差異性,對(duì)顯示緩沖區(qū)進(jìn)行抽象,實(shí)現(xiàn)上層應(yīng)用在圖形模式下直接對(duì)顯示緩沖區(qū)進(jìn)行I/O操作[8]。用戶不需要關(guān)心物理顯示緩沖區(qū)的具體位置及數(shù)據(jù)存放方式,這些都由幀緩沖設(shè)備的驅(qū)動(dòng)本身來完成。

在顯示過程中,用戶進(jìn)程的顯示數(shù)據(jù)將會(huì)存放在幀緩沖映射的內(nèi)存中,然后顯示設(shè)備會(huì)從幀緩沖映射的內(nèi)存中將數(shù)據(jù)取出,然后顯示到屏幕上。通過系統(tǒng)調(diào)用mmap將顯示設(shè)備物理內(nèi)存抽象為幀緩沖區(qū),使得用戶可以直接訪問。對(duì)用戶來說,它即是物理顯存的一個(gè)映像,幀緩沖系統(tǒng)將其映射到用戶虛擬進(jìn)程地址空間[9]。對(duì)于用戶而言,幀緩沖區(qū)可以直接讀、寫、映射。這樣用戶程序就可以對(duì)這塊內(nèi)存區(qū)域填充任何已經(jīng)定義的像素及顏色,而屏幕也就可以在幀緩沖系統(tǒng)的控制下顯示畫面[10]。

2.2 Linux幀緩沖驅(qū)動(dòng)程序的體系結(jié)構(gòu)

對(duì)于Linux系統(tǒng),幀緩沖設(shè)備是標(biāo)準(zhǔn)的字符設(shè)備,采用“文件層—驅(qū)動(dòng)層”的接口方式,主設(shè)備號(hào)為29,從設(shè)備號(hào)為0~31[11]。對(duì)應(yīng)的設(shè)備文件為/dev/fb*。在linux中,fb設(shè)備驅(qū)動(dòng)的源碼主要在Fb.h(linuxincludelinux)和Fbmem.c(linuxdriversvideo)兩個(gè)文件中,它們是fb設(shè)備驅(qū)動(dòng)的中間層,為上層提供系統(tǒng)調(diào)用,為底層驅(qū)動(dòng)提供接口。

由于Linux將設(shè)備也認(rèn)為是一個(gè)文件,F(xiàn)ramebuffer驅(qū)動(dòng)核心Fbmem.c文件中定義了幀緩沖設(shè)備的文件層接口,該接口即為file_operations結(jié)構(gòu)體,它是提供給用戶空間應(yīng)用程序使用的。在file_operations中,統(tǒng)一實(shí)現(xiàn)了字符設(shè)備文件層次上的文件操作接口函數(shù),用戶空間的應(yīng)用程序通過它的接口函數(shù)對(duì)幀緩沖設(shè)備進(jìn)行訪問[12]。在驅(qū)動(dòng)核心層上方的是Framebuffer特定幀緩沖設(shè)備層,在這一層中實(shí)現(xiàn)具體的Framebuffer驅(qū)動(dòng)接口,例如特定幀緩沖設(shè)備fb_info結(jié)構(gòu)體的注冊(cè)函數(shù),fb_ops結(jié)構(gòu)體成員函數(shù)以及使用完畢后的結(jié)構(gòu)體注銷函數(shù)[13]。fb_ops結(jié)構(gòu)體是特定幀緩沖設(shè)備層的核心模塊,它的成員函數(shù)實(shí)現(xiàn)了對(duì)應(yīng)的幀緩沖驅(qū)動(dòng)功能,最終直接控制顯示設(shè)備的硬件寄存器[14-15]。

3 Qt/Embedded GUI環(huán)境下圖形硬件加速實(shí)現(xiàn)方法

3.1 基于Qt/Embedded的嵌入式圖形硬件加速架構(gòu)

通過對(duì)Qt/Embedded底層支持和幀緩沖驅(qū)動(dòng)體系結(jié)構(gòu)的分析,提出一種基于Qt/Embedded環(huán)境的嵌入式系統(tǒng)GUI圖形加速支持體系結(jié)構(gòu),如圖1所示。

圖1 基于Qt/Embedded GUI環(huán)境的嵌入式系統(tǒng)

圖1描述了實(shí)現(xiàn)嵌入式系統(tǒng)圖形加速方法的體系結(jié)構(gòu),從上至下可以分為三部分:

(1)Qt/Embedded GUI支持及實(shí)現(xiàn)部分:該部分包含圖中最上方1,2,3層,在該部分中,通過Qt/Embedded嵌入式圖形支持中的QLinuxFbScreen對(duì)象,實(shí)現(xiàn)了Qt/Embedded庫(kù)和幀緩沖體系結(jié)構(gòu)內(nèi)接口的對(duì)接,Qt/Embedded庫(kù)使用Linux操作系統(tǒng)提供的open,write,read,close等文件系統(tǒng)接口函數(shù),基于幀緩沖驅(qū)動(dòng)體系對(duì)幀緩沖進(jìn)行操作。

(2)Framebuffer驅(qū)動(dòng)核心部分:該部分為圖中第4,5層,實(shí)現(xiàn)了VFS虛擬文件系統(tǒng)與幀緩沖驅(qū)動(dòng)體系間的對(duì)接,在這一層實(shí)現(xiàn)file_operations結(jié)構(gòu)體成員函數(shù)的內(nèi)部功能,Qt/Embedded應(yīng)用程序通過訪問file_operations結(jié)構(gòu)體統(tǒng)一實(shí)現(xiàn)的文件操作函數(shù)對(duì)幀緩沖設(shè)備進(jìn)行讀寫等操作,上層使用的文件系統(tǒng)接口在這里得到具體實(shí)現(xiàn)。

(3)Framebuffer幀緩沖設(shè)備支持部分:該部分為圖中第6層,定義了特定幀緩沖設(shè)備fb_info結(jié)構(gòu)體,它是特定幀緩沖物理設(shè)備的軟件實(shí)體和驅(qū)動(dòng)層接口的核心數(shù)據(jù)結(jié)構(gòu),記錄了關(guān)于幀緩沖設(shè)備屬性、參數(shù)以及操作函數(shù)指針的完整信息。系統(tǒng)中每一個(gè)幀緩沖設(shè)備對(duì)應(yīng)一個(gè)fb_info結(jié)構(gòu)體。在對(duì)該部分的具體實(shí)現(xiàn)過程中,通過使用硬件GPU的圖形加速功能,優(yōu)化fb_info結(jié)構(gòu)體中對(duì)應(yīng)軟件功能接口函數(shù),從而完成Qt/Embedded GUI環(huán)境下的圖形硬件加速。

3.2 嵌入式Linux下的圖形硬件加速接口設(shè)計(jì)

在嵌入式Linux的GUI圖形硬件加速架構(gòu)下,framebuffer框架最重要的實(shí)體就是fb_info,其中涉及驅(qū)動(dòng)的操作接口fb_ops,這些操作接口是framebuffer框架實(shí)現(xiàn)交互的橋梁,也是實(shí)現(xiàn)圖形硬件的途徑和接口。

fb_ops以結(jié)構(gòu)體形式展現(xiàn),內(nèi)部接口函數(shù)數(shù)量繁多,如fb_check_var()檢查可修改的屏幕參數(shù)并調(diào)整到硬件所支持的值,fb_setcolreg()設(shè)置顏色寄存器來實(shí)現(xiàn)偽顏色表和顏色表的填充等等。fb_ops結(jié)構(gòu)體的成員函數(shù)最終與顯示適配器和LCD控制器硬件打交道,需要根據(jù)顯示適配器的硬件設(shè)置及LCD顯示屏的硬件參數(shù)進(jìn)行編寫。

fb_ops結(jié)構(gòu)體圖形硬件加速成員函數(shù)接口:fb_fillrect()實(shí)現(xiàn)屏幕上矩形區(qū)域的顏色填充與繪制,fb_copyarea()實(shí)現(xiàn)對(duì)屏幕區(qū)域顯示數(shù)據(jù)的復(fù)制與重新繪制,fb_imageblit()實(shí)現(xiàn)位圖數(shù)據(jù)的讀取與繪制。這3個(gè)接口函數(shù)是實(shí)現(xiàn)GUI圖形硬件加速功能的關(guān)鍵函數(shù),它們的函數(shù)聲明代碼如下:

struct fb_ops {

……

/*繪制矩形*/

void(*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);

/*從一個(gè)區(qū)域復(fù)制數(shù)據(jù)到另一個(gè)區(qū)域*/

void(*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);

/*繪制一幅位圖到顯示設(shè)備 */

void(*fb_imageblit) (struct fb_info *info, const struct fb_image *image);

……

}

通過上述fb_ops圖形硬件加速成員函數(shù)接口,在函數(shù)體中可以使用硬件圖形繪制命令和算法,從而釋放軟件繪制圖形占用的CPU時(shí)間,實(shí)現(xiàn)圖形繪制的硬件加速。

Qt/Embedded GUI應(yīng)用程序通過fbmem.c文件的file_operations結(jié)構(gòu)體統(tǒng)一實(shí)現(xiàn)文件操作接口對(duì)幀緩沖硬件設(shè)備的訪問,特定幀緩沖硬件設(shè)備的軟件抽象與fb_info結(jié)構(gòu)體一一對(duì)應(yīng),fb_info結(jié)構(gòu)體的注冊(cè)、注銷及其中成員函數(shù)的實(shí)現(xiàn)工作由內(nèi)核中對(duì)應(yīng)的xxxfb.c文件來完成。指定的fb_ops結(jié)構(gòu)體成員函數(shù)作為驅(qū)動(dòng)層的核心模塊實(shí)現(xiàn)對(duì)應(yīng)的圖形硬件加速操作,最終通過圖形硬件控制及加速算法實(shí)現(xiàn)圖形繪制工作硬件化。

3.3 嵌入式Linux下的圖形硬件加速方法實(shí)現(xiàn)

通過前面建立起的嵌入式Linux下的圖形硬件加速架構(gòu)和硬件加速系統(tǒng)的設(shè)計(jì),在實(shí)現(xiàn)過程中可以充分利用圖形硬件加速的優(yōu)勢(shì):2D圖形硬件加速?zèng)]有大量的循環(huán)操作占用CPU時(shí)間,在硬件加速過程中,只有兩個(gè)基本的CPU操作—等待和賦值,極大地節(jié)約了CPU時(shí)間,從而大大地提高了圖形操作的效率。其中具體的繪圖工作通過DMA(直接內(nèi)存存取)由GPU(圖形處理單元)完成,在使用GPU的過程中,依賴GPU提供的各種功能寄存器對(duì)GPU的功能進(jìn)行控制。等待操作和DMA操作的具體流程如圖2所示。

圖2 等待操作和DMA操作的流程

圖2中一共有兩組不同的繪圖操作,每組操作內(nèi)部都是等待DMA命令狀態(tài)和繪圖操作執(zhí)行交替執(zhí)行。在DMA等待過程中,釋放CPU時(shí)間片,CPU處于空閑狀態(tài)??刂艱MA等待和開始執(zhí)行的寄存器為DMA控制命令寄存器DMA_COMMAND。

在具體的實(shí)現(xiàn)過程中,2D圖形硬件加速包含如下內(nèi)容:矩形填充、位塊傳輸BitBLT、圖像旋轉(zhuǎn)和地址定位、圖像剪切、光柵操作、矩形區(qū)域復(fù)制等。

現(xiàn)選取較為有代表性的矩形填充、位塊傳輸BitBLT、矩形區(qū)域復(fù)制三個(gè)操作進(jìn)行具體實(shí)現(xiàn)。

3.3.1 矩形填充

矩形填充,指的是對(duì)一個(gè)矩形區(qū)域進(jìn)行像素的填充。矩形填充功能的實(shí)現(xiàn),依賴于GPU提供的Fast Solid Color Fill(快速固色填充)功能,通過前文提到的fb_fillrect()接口實(shí)現(xiàn)。在fb_fillrect()接口的輸入?yún)?shù)結(jié)構(gòu)體fb_info中,獲得了目標(biāo)圖像的基地址、目標(biāo)圖像顏色以及圖像顏色模式和通道信息。在輸入?yún)?shù)結(jié)構(gòu)體fb_fillrect中,獲得了目標(biāo)圖像的左上角坐標(biāo)和右下角坐標(biāo),確定了圖像的位置,在確定目標(biāo)圖像信息后,將這些信息輸入到快速固色填充功能寄存器中,啟動(dòng)GPU進(jìn)行圖像的繪制。矩形填充的邏輯流程見圖3。

在矩形填充開始前,需等待上一個(gè)DMA操作結(jié)束,通過訪問前文提到的DMA控制命令寄存器DMA_COMMAND來獲取當(dāng)前DMA狀態(tài),在DMA可用之后,從結(jié)構(gòu)體fb_info中讀出目標(biāo)圖像基地址,將它寫入地址寄存器DST_BASE_ADDR_REG,然后從fb_info中讀取出目標(biāo)圖像顏色相關(guān)信息,從結(jié)構(gòu)體fb_fillrect中讀出圖像最終顯示位置坐標(biāo),將它們分別寫入每個(gè)對(duì)應(yīng)的功能寄存器,最后通過使能Fast Solid Color Fill命令寄存器BITBLT_COMMAND_REG啟動(dòng)GPU的快速固色填充功能,完成圖像矩形填充的繪制工作。

圖3 矩形填充的邏輯流程

3.3.2 位塊傳輸BitBLT

位塊傳輸BitBLT,指的是將源設(shè)備環(huán)境區(qū)域中的像素進(jìn)行位塊(bit_block)轉(zhuǎn)換,以傳送到目標(biāo)設(shè)備環(huán)境。位塊傳輸功能依賴于GPU中的BitBLT功能,在前文提到的接口fb_imageblit()中實(shí)現(xiàn)。在fb_imageblit()的參數(shù)結(jié)構(gòu)體fb_info中,獲取目標(biāo)圖像的基地址和左上角和右下角坐標(biāo),目標(biāo)圖像的前景色和背景色,目標(biāo)圖像的stride值等信息,在參數(shù)結(jié)構(gòu)體fb_image中,獲得了源圖像的左上角和右下角坐標(biāo),源圖像的數(shù)據(jù)指針、顏色模式、通道模式等信息。在獲得所有相關(guān)信息后,使能位塊傳輸?shù)拿罴拇嫫鲉?dòng)GPU的位塊傳輸功能。位塊傳輸BitBLT的邏輯流程見圖4。

圖4 位塊傳輸BitBLT的邏輯流程

在實(shí)現(xiàn)位塊傳輸?shù)倪^程中,需要注意的是GPU硬件中的BitBLT操作分為On-Screen Rendering(在屏渲染)和Off-Screen Rendering(離屏渲染)。on-screen BitBLT操作在屏幕上拷貝一個(gè)矩形像素塊到屏幕上的另一個(gè)位置,而off-screen BitBLT操作是將像素?cái)?shù)據(jù)從off-screen內(nèi)存放到屏幕內(nèi)存幀緩沖區(qū),當(dāng)SRC_COLOR_MODE_REG值和DST_COLOR_MODE_REG不相同時(shí),該操作會(huì)自動(dòng)進(jìn)行顏色模式轉(zhuǎn)換。在這里實(shí)現(xiàn)的是off-screen位塊傳輸BitBLT操作。

3.3.3 矩形區(qū)域復(fù)制

矩形區(qū)域復(fù)制,指的是選擇一個(gè)矩形區(qū)域的圖像并把它復(fù)制到另一個(gè)矩形區(qū)域顯示。實(shí)現(xiàn)該功能由GPU提供的Clipping功能以及GPU的BitBLT功能中的On-Screen Rendering共同完成。GPU的Clipping功能提供一個(gè)clipping window,使用這個(gè)clipping window確定裁剪的圖像大小及位置,clipping window的大小必須小于屏幕大小。在前文的fb_copyarea()接口中,通過fb_copyarea結(jié)構(gòu)體獲得需要裁剪的區(qū)域位置和大小,并將位置和大小參數(shù)傳到Clipping功能寄存器,然后通過on-screen BitBLT操作將裁剪的圖像繪制到屏幕。繪制的目標(biāo)圖像的信息從參數(shù)結(jié)構(gòu)體fb_info中獲取。矩形區(qū)域復(fù)制的邏輯流程基本與圖4類似,在矩形區(qū)域復(fù)制的過程中,無(wú)需進(jìn)行圖4中的源圖像寄存器相關(guān)操作。

在矩形區(qū)域復(fù)制的過程中,源圖像的基本信息大部分都由GPU硬件Clipping操作獲得,在實(shí)現(xiàn)過程中有3點(diǎn)需要注意:源基地址和目標(biāo)基地址一致;源stride值和目標(biāo)stride值一致;源顏色模式和目標(biāo)顏色模式一致。

反映在寄存器對(duì)應(yīng)關(guān)系上即為:

SRC_BASE_ADDR_REG = DST_BASE_ADDR_REG

SRC_STRIDE_REG = DST_STRIDE_REG

SRC_COLOR_MODE_REG = DST_COLOR_MODE_

REG

這也是矩形區(qū)域賦值的前提要求。

4 圖形硬件加速測(cè)試

4.1 測(cè)試平臺(tái)與環(huán)境

文中使用的測(cè)試平臺(tái)是訊為科技的iTop-4412開發(fā)板,iTop-4412開發(fā)板精英版搭載三星Exynos 4412處理器,配備1 GB DDR3內(nèi)存,4 GB固態(tài)硬盤EMMC存儲(chǔ)。

三星Exynos 4412處理器搭載4核心Cortex-A9,每個(gè)核心的主頻大小為1.6 GHz,內(nèi)部圖形核心為Mail400MP。

測(cè)試平臺(tái)的軟件環(huán)境為嵌入式Linux+Qt操作系統(tǒng),Linux內(nèi)核版本為3.0.15,Qt/Embedded庫(kù)版本為4.7.1,使用u-boot-1.3.4引導(dǎo)啟動(dòng)軟件環(huán)境,交叉編譯器為arm-2009q3。

4.2 測(cè)試方法

測(cè)試以最典型的矩形填充功能為例,編寫基于Qt/Embedded庫(kù)的Qt GUI測(cè)試?yán)?。在該例程中,使用Qt/Embedded庫(kù)自帶的矩形繪制功能drawRcet函數(shù)進(jìn)行矩形填充,通過內(nèi)部計(jì)時(shí)器計(jì)算出Qt/Embedded庫(kù)的繪圖時(shí)間,同時(shí)在該例程中通過ioctl接口調(diào)用前面實(shí)現(xiàn)的底層硬件加速功能進(jìn)行矩形填充,按同樣方式計(jì)算出繪圖時(shí)間,并將該時(shí)間與Qt/Embedded庫(kù)的繪制時(shí)間進(jìn)行對(duì)比,從而得出測(cè)試結(jié)果。

4.3 測(cè)試結(jié)果與分析

測(cè)試1,繪制寬度﹡高度為40﹡30像素的矩形,重復(fù)次數(shù)為10 000,20 000,30 000,40 000,50 000,結(jié)果見圖5。

圖5 不同繪制次數(shù)下的加速效果對(duì)比

從圖中可以看出,隨著繪制次數(shù)的增加,Qt繪制矩形的時(shí)間基本呈線性增長(zhǎng),在使用硬件加速功能后,繪制同樣次數(shù)矩形的時(shí)間大大縮短;同樣,隨著繪制次數(shù)的增加,加速后的繪制時(shí)間也單調(diào)遞增,但增加的幅度略有波動(dòng)。對(duì)圖中數(shù)據(jù)進(jìn)行計(jì)算后可知,加速比(加速前時(shí)間/加速后時(shí)間)基本在2.3~2.7之間,實(shí)現(xiàn)了圖形繪制硬件加速的效果。

測(cè)試2,繪制50 000次不同像素的矩形,像素寬度*高度分別為40*30,60*45,80*60,100*75,120*90,結(jié)果見圖6。

圖6 繪制不同像素矩形的加速效果對(duì)比

從圖中可知,隨著繪制矩形像素?cái)?shù)目的增加,無(wú)論是Qt繪制,還是硬件加速后繪制,繪制所需的時(shí)間都基本是線性增加的,使用Qt繪制時(shí)間的增加基本與像素?cái)?shù)目的增加成正比,增量較為平滑,使用硬件加速后的繪制時(shí)間的增量略有波動(dòng)。

綜合圖5和圖6的數(shù)據(jù)可知,硬件加速后,在矩形填充這個(gè)基本圖形操作上,硬件加速獲得了較好的效果,加速比基本維持在2以上,實(shí)現(xiàn)了預(yù)期的目的。

5 結(jié)束語(yǔ)

通過對(duì)Qt/Embedded體系結(jié)構(gòu)和Qt/Embedded圖形引擎架構(gòu)的分析,利用嵌入式Linux下的幀緩沖體系結(jié)構(gòu),提出一種Qt/Embedded GUI環(huán)境下圖形硬件加速實(shí)現(xiàn)方法和圖形加速實(shí)現(xiàn)架構(gòu)。實(shí)現(xiàn)了幀緩沖體系對(duì)Qt/Embedded GUI體系的底層硬件支持,依賴于Linux幀緩沖體系的加速接口,使用硬件GPU內(nèi)部加速功能對(duì)Qt/Embedded GUI環(huán)境下的基本圖形繪制進(jìn)行了硬件加速,取得了較好的加速效果。

參考文獻(xiàn):

[1] 蔣 飛.基于嵌入式Linux系統(tǒng)的數(shù)字電視GUI圖形加速設(shè)計(jì)[D].北京:北京郵電大學(xué),2010.

[2] 李升亮,徐劍鋒,李峻林.嵌入式系統(tǒng)中的多窗口GUI系統(tǒng)的研究[J].計(jì)算機(jī)與數(shù)字工程,2008,36(10):126-128.

[3] 周 鴻.基于嵌入式系統(tǒng)的智能縫制設(shè)備研究[D].西安:西安電子科技大學(xué),2010.

[4] 李軍民,祝紅軍.基于ARMlinux平臺(tái)的QT/E鍵盤實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2008,24(26):27-29.

[5] 周 開,倪 偉.基于Qt/E的嵌入式Linux GUI研究與實(shí)現(xiàn)[J].淮陰工學(xué)院學(xué)報(bào),2015,24(3):10-13.

[6] 嚴(yán)吉國(guó).基于嵌入式Linux的200MHz數(shù)字存儲(chǔ)示波器的設(shè)計(jì)與實(shí)現(xiàn)[D].南京:東南大學(xué),2009.

[7] CHEN F,FAN X.Embedded system’s performance analysis with RTC and QT[C]//Proceedings of the 7th international conference on advanced parallel processing technologies.Berlin:Springer-Verlag,2007:569-579.

[8] 郭小梅.Linux下的幀緩沖設(shè)備驅(qū)動(dòng)研究與應(yīng)用[J].工業(yè)控制計(jì)算機(jī),2012,25(6):3-4.

[9] YANG L, SANDER P V, LAWRENCE J. Geometry-aware framebuffer level of detail[J].Computer Graphics Forum,2008,27(4):1183-1188.

[10] MAO C,JOHNSON K M.Fast-switching liquid-crystal-on-silicon microdisplay with framebuffer pixels and surface-mode optically compensated birefringence[J].Optical Engineering,2006,45(12):1269-1278.

[11] 趙 潔,龔 威.嵌入式Linux幀緩沖設(shè)備驅(qū)動(dòng)程序[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2010,19(12):208-211.

[12] CHANG C Y,HUANG C H,CHU Y S.Efficient memory access methods for framebuffer-less video processing applications[C]//IEEE international symposium on circuits and systems.[s.l.]:IEEE,2013:3026-3029.

[13] 宋方偉,劉 勇,聶詩(shī)良,等.SM502移動(dòng)多媒體協(xié)處理器在嵌入式系統(tǒng)中的應(yīng)用[J].兵工自動(dòng)化,2010,29(2):91-92.

[14] 蘇哲欣,劉鴻飛,薛 曉.基于嵌入式Linux的LCD驅(qū)動(dòng)分析與實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2009,22(2):29-30.

[15] 黃相平,余水寶,夏 燦.基于S3C6410平臺(tái)的嵌入式Linux系統(tǒng)LCD驅(qū)動(dòng)模塊[J].微型機(jī)與應(yīng)用,2013,32(13):9-12.

猜你喜歡
矩形嵌入式繪制
Art on coffee cups
兩矩形上的全偏差
化歸矩形證直角
放學(xué)后
童話世界(2018年17期)2018-07-30 01:52:02
搭建基于Qt的嵌入式開發(fā)平臺(tái)
從矩形內(nèi)一點(diǎn)說起
嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應(yīng)用
在轉(zhuǎn)變中繪制新藍(lán)圖
Altera加入嵌入式視覺聯(lián)盟
倍福 CX8091嵌入式控制器
筠连县| 彰化市| 苏尼特左旗| 墨脱县| 普陀区| 湟源县| 肇州县| 龙岩市| 土默特右旗| 尚义县| 亚东县| 深州市| 沾化县| 岱山县| 昭通市| 尼勒克县| 平湖市| 乳山市| 襄城县| 郁南县| 进贤县| 台安县| 饶河县| 嘉义县| 东兴市| 柳河县| 太仆寺旗| 海晏县| 菏泽市| 大化| 七台河市| 耒阳市| 富川| 根河市| 绵竹市| 象山县| 江津市| 宜兰县| 长治县| 博野县| 方正县|