李華君,楊 震,張曉峰
(中國(guó)船舶重工集團(tuán)公司第七二四研究所,南京 211153)
基于MFC消息機(jī)制與Direct3D的雷達(dá)目標(biāo)顯示實(shí)現(xiàn)
李華君,楊 震,張曉峰
(中國(guó)船舶重工集團(tuán)公司第七二四研究所,南京 211153)
針對(duì)現(xiàn)代雷達(dá)綜合化和信息化的發(fā)展趨勢(shì),為滿足對(duì)雷達(dá)目標(biāo)的多功能處理以及顯示容量提升的需求,提出了一種在MFC構(gòu)架下結(jié)合DirectX圖形技術(shù)實(shí)現(xiàn)較大數(shù)量目標(biāo)顯示控制的方法。該方法使用Window控件來(lái)封裝雷達(dá)目標(biāo)類,利用控件的實(shí)現(xiàn)及其消息映射機(jī)制簡(jiǎn)化目標(biāo)在終端顯示時(shí)的生成、選取、更新、刪除及疊加等功能處理中的計(jì)算和消息響應(yīng)過程,同時(shí)采用Direct3D技術(shù)降低目標(biāo)的繪制和刷新時(shí)間,提高了目標(biāo)的顯示批數(shù)。
MFC;消息映射機(jī)制;Direct3D;雷達(dá)目標(biāo)顯示
雷達(dá)終端用來(lái)顯示雷達(dá)所獲取的目標(biāo)信息和情報(bào),顯示內(nèi)容包括目標(biāo)的位置、坐標(biāo)及其運(yùn)動(dòng)情況,以及目標(biāo)的特征參數(shù)等。早期的雷達(dá)終端主要采用模擬技術(shù)來(lái)顯示雷達(dá)的原始圖像。隨著數(shù)字技術(shù)的飛速發(fā)展、雷達(dá)功能的擴(kuò)展及信息化程度的提高,現(xiàn)代雷達(dá)的終端顯示也發(fā)生了較大的變化。除了顯示雷達(dá)原始視頻外,還要顯示處理后的雷達(dá)數(shù)據(jù),生成直觀可見的界面目標(biāo)圖示,同時(shí)對(duì)其進(jìn)行各種功能的處理和操作。智能化及綜合一體化的武器裝備發(fā)展趨勢(shì)進(jìn)一步要求雷達(dá)終端不僅需要顯示本雷達(dá)探測(cè)的信息情報(bào),還需要顯示信息化組網(wǎng)后多源提供的各種信息。雷達(dá)終端顯示日趨復(fù)雜,對(duì)目標(biāo)顯示的實(shí)時(shí)性和可操作性提出了更高的要求。在同等硬件資源支撐下,如何便捷地對(duì)目標(biāo)進(jìn)行管理、對(duì)目標(biāo)顯示進(jìn)行優(yōu)化,提升顯示的目標(biāo)數(shù)量,成為需要解決的一項(xiàng)課題。隨著軟件開發(fā)技術(shù)的發(fā)展,為設(shè)計(jì)者在Windows系統(tǒng)下使用軟件實(shí)現(xiàn)終端顯示提供了更多的技術(shù)手段和設(shè)計(jì)自由度,用以解決雷達(dá)終端顯示設(shè)計(jì)中所面臨的挑戰(zhàn)[1]。
著眼于雷達(dá)終端顯示中雷達(dá)目標(biāo)的實(shí)現(xiàn),通過對(duì)比以往設(shè)計(jì)中的軟件技術(shù)方法,改進(jìn)設(shè)計(jì)思路,本文提出了一種在MFC構(gòu)架下結(jié)合DirectX圖形技術(shù)將界面目標(biāo)管理功能實(shí)現(xiàn)簡(jiǎn)化和提升目標(biāo)顯示數(shù)量的方法。
1.1 MFC概述
MFC是一個(gè)架構(gòu)在Windows API之上的C++類庫(kù),意圖使Windows程序設(shè)計(jì)更加高效簡(jiǎn)便,其實(shí)現(xiàn)基于程序的自動(dòng)初始化、執(zhí)行時(shí)類型識(shí)別、動(dòng)態(tài)生成、消息映射及命令繞行等關(guān)鍵技術(shù)。盡管Windows下的代碼實(shí)現(xiàn)被逐步向.NET框架下引導(dǎo),其對(duì)編程語(yǔ)言、代碼通用性、體系架構(gòu)、內(nèi)存管理等諸多方面拓展了相關(guān)概念和技術(shù),對(duì)原有的架構(gòu)進(jìn)行重組和優(yōu)化,但對(duì)于面向?qū)ο驛PI的封裝、動(dòng)態(tài)生成及消息映射等技術(shù)和思想?yún)s依然沿襲[3]。
Windows程序基于事件驅(qū)動(dòng),靠消息的流動(dòng)而維護(hù)生命。在MFC之中只要是CCmdTarget類的繼承類,都納入其消息傳遞的機(jī)制中,為每個(gè)類型的消息建立相應(yīng)的消息映射表,并且將基礎(chǔ)類別和衍生類別的消息映射表串接起來(lái)。在此基礎(chǔ)上,MFC通過一系列的宏定義將消息縱向或橫向的傳遞映射到不同類的成員函數(shù)進(jìn)行處理,如圖1所示。
圖1 MFC消息映射機(jī)制示意圖
同時(shí),MFC封裝了大量的類和控件可供設(shè)計(jì)者使用,如CWnd類以及其繼承類CStatic等。CStatic類的資源實(shí)體以控件的形式存在,其類實(shí)現(xiàn)和對(duì)消息機(jī)制的響應(yīng)可為雷達(dá)目標(biāo)類的封裝和實(shí)現(xiàn)使用。
1.2 DirectX簡(jiǎn)介
DirectX是Microsoft公司開發(fā)的運(yùn)行于計(jì)算機(jī)平臺(tái)的多媒體控制處理引擎。基于DirectX API 設(shè)計(jì)開發(fā)的多媒體軟件運(yùn)行于硬件抽象層上,即充分利用了系統(tǒng)硬件的加速功能,又隱藏了硬件相關(guān)的設(shè)備特性,通過編寫可兼容不同設(shè)備特性的高效代碼,提高運(yùn)行效率。
Direct3D是DirectX 技術(shù)的重要組成部分,是一種軟件接口。它通過提供對(duì)顯示存儲(chǔ)的直接訪問, 以及快速實(shí)現(xiàn)硬件的位塊轉(zhuǎn)移和緩存翻轉(zhuǎn)性能, 從而加速硬件和軟件圖形的實(shí)時(shí)處理。除了能直接對(duì)顯示設(shè)備存取外, Direct3D還保持同Windows 圖形設(shè)備接口GDI、基于Windows環(huán)境的應(yīng)用程序和設(shè)備驅(qū)動(dòng)程序兼容的特性,并提供了一種與設(shè)備無(wú)關(guān)的方法以獲得訪問特定的顯示設(shè)備、 高級(jí)特性的能力[2]。
GDI+ 是一個(gè)Windows系統(tǒng)組件, 在GDI的基礎(chǔ)上實(shí)現(xiàn)的一個(gè)抽象層, 允許標(biāo)準(zhǔn)的Windows應(yīng)用程序向屏幕繪畫。GDI+的缺點(diǎn)是其提供的是對(duì)內(nèi)存而不是對(duì)視頻存儲(chǔ)器中的一個(gè)視頻緩存的訪問, 因此不能利用某些視頻卡所提供的特殊性能。由于GDI+建立在Windows的一個(gè)較高層面上,系統(tǒng)調(diào)用的開銷難免增加。另一方面, Direct3D可以提供代表實(shí)際視頻存儲(chǔ)器的繪畫圖面。 這就意味著當(dāng)使用Direct3D時(shí)可以直接寫到視頻卡上的存儲(chǔ)器中, 使用圖形例程極快。 這些圖面被表示為存儲(chǔ)器中相鄰的存儲(chǔ)塊, 從而可以很容易地對(duì)存儲(chǔ)器執(zhí)行尋址操作。
Direct3D、GDI+、硬件抽象層HAL 、硬件仿真層HEL 和硬件之間的關(guān)系如圖2所示。
圖2 Direct3D、GDI+和硬件關(guān)系示意圖
目前,相當(dāng)數(shù)量應(yīng)用軟件轉(zhuǎn)到了Windows 平臺(tái)上。在Windows 平臺(tái)上,開發(fā)網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)集成的多功能圖形顯示處理程序,對(duì)合理分配系統(tǒng)資源、維持程序高效運(yùn)行并提高程序的復(fù)用性、節(jié)約開發(fā)時(shí)間提出了較高的要求。另一方面,隨著信息化武器裝備的發(fā)展,雷達(dá)終端不僅需要處理自身探測(cè)的目標(biāo),還需要和各種信息源傳遞大量數(shù)據(jù)。信息內(nèi)容的增加、信息交互的密集體現(xiàn)在雷達(dá)終端需處理的目標(biāo)批次的提升,加快了目標(biāo)的生成、分裂、合批、刪除及上報(bào)等操作和處理的頻率。
由于Windows系統(tǒng)的特殊性,接管了所有的系統(tǒng)資源,對(duì)設(shè)備的操作實(shí)際上是對(duì)Windows 功能的調(diào)用,雖提高了代碼設(shè)備無(wú)關(guān)性、可移植性和可復(fù)用性,但調(diào)用Windows 的API函數(shù)比直接操作硬件耗時(shí)增加。對(duì)于某些應(yīng)用程序來(lái)說,這種影響可能不太明顯,特別是在目前機(jī)器性能飛速提高的情況下更是如此。但是,對(duì)于目前部分裝備中對(duì)實(shí)時(shí)性較高的終端顯示處理來(lái)說,在對(duì)大量的目標(biāo)顯示和數(shù)據(jù)處理時(shí),若每次都去調(diào)用API 函數(shù),耗時(shí)將會(huì)影響軟件的實(shí)際應(yīng)用。
針對(duì)上述面臨的需求和問題,通過結(jié)合MFC構(gòu)架中控件的消息響應(yīng)機(jī)制和DirectX繪圖方法封裝構(gòu)造目標(biāo)類,利用控件實(shí)現(xiàn)目標(biāo)生命周期中的管理、目標(biāo)操作和處理中的輸入響應(yīng),而將目標(biāo)的繪制和顯示交由Direct3D來(lái)完成,以達(dá)到簡(jiǎn)化目標(biāo)設(shè)計(jì),提高目標(biāo)處理容量的目的。
2.1 Direct3D與GDI+的使用
基于MFC構(gòu)建應(yīng)用程序主體框架,在其文檔/視圖構(gòu)架下,終端顯示畫面及目標(biāo)的顯示在P顯視圖中完成。和以往不同的是,考慮到Direct3D在二維曲線繪制和文字處理方面的欠缺,對(duì)雷達(dá)終端畫面中除目標(biāo)外的靜態(tài)顯示內(nèi)容依然采用GDI+進(jìn)行繪制,處理方式如下:
(1) 在GDI+的原生模式下,在MFC應(yīng)用程序中加載GDI+動(dòng)態(tài)鏈接庫(kù),在P顯視圖窗口中完成GDI+的初始化;
(2) 在P顯視圖窗口刷新函數(shù)OnDraw()中使用GDI+接口完成所需顯示內(nèi)容的繪制;
(3) 將繪制的窗口以位圖或其他文件形式加以存儲(chǔ);
(4) 創(chuàng)建Direct3D紋理對(duì)象,將GDI+繪制的圖像文件作為紋理加以載入。
一般情況下,P顯視圖窗口函數(shù)OnDraw()作為視圖的刷新接口,而在上述實(shí)現(xiàn)方式中僅作為利用GDI+繪制優(yōu)勢(shì)形成所需靜態(tài)位圖的生成接口,用以提供Direct3D顯示的底圖紋理,當(dāng)位圖文件生成后阻斷其常規(guī)刷新功能。P顯視圖窗口的刷新將由Direct3D函數(shù)OnRender()完成。
下面介紹在P顯視圖的實(shí)現(xiàn)中如何引入Direct3D。
(1) 創(chuàng)建Direct3D對(duì)象并得到Direct3D接口,對(duì)相關(guān)參數(shù)進(jìn)行配置和初始化;
(2) 創(chuàng)建Direct3D設(shè)備對(duì)象并得到設(shè)備接口,將P顯視圖窗口的句柄綁定為Direct3D窗口句柄;
(3) 創(chuàng)建一個(gè)單獨(dú)的顯示線程用以處理Direct3D窗口的顯示和刷新函數(shù)OnRender()。
采用上述實(shí)現(xiàn),將P顯視圖窗口的句柄綁定為Direct3D窗口句柄,將其OnRender()函數(shù)作為P顯的刷新接口,解決了GDI+和Direct3D繪制同步問題。進(jìn)一步采用單獨(dú)的線程處理顯示畫面的繪制和刷新,將刷新率較高的目標(biāo)顯示畫面從程序主線程中分離出來(lái),將合理分配和調(diào)度計(jì)算機(jī)的系統(tǒng)資源,利于在系統(tǒng)空閑時(shí)對(duì)畫面進(jìn)行渲染和刷新。通過MFC視圖和Direct3D的結(jié)合使用,為目標(biāo)提供了作為運(yùn)行環(huán)境的父窗口,目標(biāo)的生成、刪除、繪制及顯示均由此P顯父窗口負(fù)責(zé)。
2.2 雷達(dá)目標(biāo)類的實(shí)現(xiàn)
目標(biāo)的實(shí)現(xiàn)是雷達(dá)終端顯示畫面中的一個(gè)主體部分。在面向?qū)ο蟮脑O(shè)計(jì)中,通過構(gòu)造和封裝目標(biāo)類,將其添加于父視圖中,通過父窗口的繪制刷新和消息響應(yīng)機(jī)制對(duì)目標(biāo)進(jìn)行管理和操作??赡苡龅降膯栴}是,目標(biāo)的生命周期是一個(gè)動(dòng)態(tài)過程,對(duì)目標(biāo)的處理是相對(duì)復(fù)雜的。如果設(shè)計(jì)為將目標(biāo)的產(chǎn)生、繪制、定位、更新、撤銷及疊加等所有管理都交由其父窗口處理,那么在進(jìn)行目標(biāo)選取時(shí)處理諸如如何識(shí)別目標(biāo)和背景、目標(biāo)疊加時(shí)如何進(jìn)行識(shí)別和分離等問題時(shí)都需要進(jìn)行檢索和大量的計(jì)算,在目標(biāo)批次增加的情況下,程序的運(yùn)行效率會(huì)受到一定影響。通過目標(biāo)檢索算法的優(yōu)化和目標(biāo)封裝的改進(jìn),可以對(duì)此類問題加以改善,但對(duì)設(shè)計(jì)者提出了更高的要求。而利用Windows控件的消息響應(yīng)機(jī)制,可以簡(jiǎn)化在目標(biāo)實(shí)現(xiàn)時(shí)的此類問題。
在Windows MFC的類別階層架構(gòu)中,封裝了大量的用于圖形顯示的控件類。從其父類CWnd開始,通過類繼承以及類擴(kuò)展,構(gòu)造出圖形顯示所需要的各界面元素,同時(shí)為這些類的各種消息響應(yīng)提供了相應(yīng)的處理函數(shù)。在控件的使用中,可通過消息處理函數(shù)的重載以及改變消息傳遞的次序和線路來(lái)完成所需的功能。如圖3所示,通過控件類CStatic構(gòu)造所需目標(biāo)子類CMytarget,而將CMyView類作為CMytarget的父窗口。目標(biāo)類CMytarget的實(shí)現(xiàn)方式主要分為如下幾步:
(1) 從Windows MFC類庫(kù)中的CWnd類或CStatic控件類派生出雷達(dá)目標(biāo)類;
(2) 根據(jù)雷達(dá)目標(biāo)的特性聲明和實(shí)現(xiàn)雷達(dá)目標(biāo)類的相關(guān)變量以及創(chuàng)建、銷毀等接口函數(shù);
(3) 重載從父類繼承的鼠標(biāo)和鍵盤消息響應(yīng)函數(shù),使雷達(dá)目標(biāo)類具有選取等操作的自處理響應(yīng)功能;
圖3 目標(biāo)類的消息映射示意圖
(4) 在目標(biāo)類中聲明目標(biāo)繪制的Direct3D位圖矩形頂點(diǎn)緩沖區(qū),同時(shí)引入其父窗口P顯視圖中創(chuàng)建的Direct3D設(shè)備接口,進(jìn)行目標(biāo)繪制的頂點(diǎn)數(shù)據(jù)填充。在視P顯圖刷新接口OnRender()中,調(diào)用目標(biāo)的D3D繪制接口,完成目標(biāo)和父窗口的疊加繪制和刷新。
目標(biāo)類完成實(shí)現(xiàn)后,目標(biāo)的管理基于控件類的消息響應(yīng)機(jī)制,而繪制和刷新將結(jié)合Direct3D技術(shù)。目標(biāo)在作為運(yùn)行環(huán)境的P顯父窗口中加以聲明,父窗口調(diào)用目標(biāo)的相應(yīng)成員函數(shù),基于對(duì)控件的動(dòng)態(tài)管理來(lái)實(shí)現(xiàn)目標(biāo)的生成和銷毀等功能。同時(shí),通過重載父窗口的PreTranslateMessage虛函數(shù),使父窗口中的鼠標(biāo)和鍵盤消息先由目標(biāo)類自動(dòng)截獲,從而將目標(biāo)類的定位、更新及疊加等操作轉(zhuǎn)變?yōu)閷?duì)控件的檢索、移動(dòng)等處理。通過改變消息映射的流動(dòng)線路,完成了對(duì)目標(biāo)的自選取和自處理。消息處理完畢后再交還給父窗口,而目標(biāo)的繪制通過父窗口的渲染函數(shù)處理完成。
為了對(duì)上述方法的有效性進(jìn)行驗(yàn)證,選用配置為Intel Pentium Dual 2.20GHz、內(nèi)存為2GB的計(jì)算機(jī)進(jìn)行了相關(guān)測(cè)試。分別使用GDI+、雙緩沖結(jié)合GDI+及Direct3D 三種方法對(duì)雷達(dá)目標(biāo)進(jìn)行實(shí)現(xiàn)。在不同目標(biāo)批數(shù)下,每種方法的平均刷新時(shí)間如圖 4所示。
圖4 三種繪制方法刷新時(shí)間比較圖
從圖表數(shù)據(jù)分析不難得出, 在目標(biāo)數(shù)量小于300批時(shí),三種方法的刷新時(shí)間雖小有差異,但均可滿足刷新的實(shí)時(shí)性要求;目標(biāo)數(shù)量達(dá)到500批時(shí),使用GDI+繪制方法的時(shí)間斜率明顯增大,從現(xiàn)象上看目標(biāo)刷新線程和UI主線程的時(shí)間沖突開始體現(xiàn),程序的實(shí)時(shí)響應(yīng)受到一定影響;當(dāng)目標(biāo)數(shù)量達(dá)到1000批時(shí),用雙緩沖優(yōu)化的GDI+繪制方法將無(wú)法達(dá)到要求,而采用Direct3D繪制方法的時(shí)間斜率較為平滑,可以處理近2000批目標(biāo)。
基于MFC和DirectX結(jié)合的雷達(dá)目標(biāo)實(shí)現(xiàn)方法,用Windows控件及其消息映射機(jī)制封裝出雷達(dá)目標(biāo)類,簡(jiǎn)化了目標(biāo)的處理設(shè)計(jì)??梢酝ㄟ^進(jìn)一步的優(yōu)化,將此控件類實(shí)現(xiàn)為動(dòng)態(tài)鏈接庫(kù)或是COM組件,提高目標(biāo)類的可復(fù)用性和可擴(kuò)展性。采用Direct3D實(shí)現(xiàn)目標(biāo)類的繪制和刷新,有效地提升了目標(biāo)處理的容量。而利用Direct3D的多層顯示、多緩沖及頁(yè)面切換等技術(shù),也有利于將Direct3D實(shí)現(xiàn)的雷達(dá)一次視頻和目標(biāo)顯示進(jìn)行疊加實(shí)現(xiàn)。當(dāng)然,在使用Windows控件的自處理優(yōu)勢(shì)時(shí)目標(biāo)類也變得較“大而重”,從圖4中也可看出,當(dāng)目標(biāo)批數(shù)進(jìn)一步增加后,如何提高此方法的目標(biāo)刷新率需進(jìn)行進(jìn)一步的探討。
[1] 丁鷺飛,耿富錄.雷達(dá)原理[M].3版.西安:西安電子科技大學(xué)出版社,2002.6.
[2] 陳卡,等.DirectX9 3D圖形程序設(shè)計(jì)[M].上海:上??萍汲霭嫔纾?003.7.
[3] 侯俊杰.深入淺出MFC[M].2版.臺(tái)灣:松崗電腦圖資料股份有限公司,2002.10.
Implementation of radar target display based on MFC message mechanism and Direct3D
LI Hua-jun, YANG Zhen, ZHANG Xiao-feng
(No. 724 Research Institute of CSIC, Nanjing 211153)
In view of the integrated and information development trends of modern radars, a method of displaying and controlling large quantities of targets is presented based on the MFC and the DirectX graphic technology to satisfy the requirements of multi-function processing and display capacity upgrade of radar targets. The Window controls are used to encapsulate radar target class, and the realization of controls and the message mapping mechanism are utilized to simplify the calculation and message response process in the function processing such as generate, select, update, delete and overlap when targets are displayed on the terminal display. At the same time, the adoption of Direct3D technology decreases the refresh and plotting time of targets and increases the number of targets.
MFC; message mapping mechanism; Direct3D; radar target display
2014-05-28;
2014-06-12
李華君(1979-),工程師,碩士,研究方向:軟件應(yīng)用;楊震(1979-),男,工程師,研究方向:系統(tǒng)集成;張曉峰(1979-),男,高級(jí)工程師,碩士,研究方向:軟件應(yīng)用。
TN957.52
A
1009-0401(2014)03-0052-04