劉建新,明 亮,張 霆,趙立營
(南京電子技術研究所, 江蘇 南京 210039)
雷達顯控軟件為提供了操作員與雷達系統(tǒng)的人機交互接口[1],其用戶體驗直接影響戰(zhàn)術操作與戰(zhàn)場決策,流暢的人機交互界面決勝戰(zhàn)場的基本保障[2-3]。隨著雷達技術的不斷發(fā)展,雷達探測能力的不斷提升[4-5],雷達航跡容量與日俱增,傳統(tǒng)雷達顯控軟件的航跡顯示方法已不能滿足當前雷達對顯示效率的要求。
目前大部分雷達顯控軟件在進行航跡顯示時,采用的是逐點繪制的方法,這種主要存在三個問題:一是繪制航跡時需要在一個繪制周期內(nèi)遍歷所有航跡點,在目標容量巨大的情況下完成該工作需要耗費較大的中央處理單元(CPU)資源;二是逐點將內(nèi)存中的數(shù)據(jù)傳到圖形處理器(GPU)[6]造成總線資源的浪費;三是每次只繪制一個航跡點,無法充分利用GPU高并行的處理能力,導致GPU資源浪費。
針對上述問題,本文設計了一種高效的雷達航跡顯示方法,該方法利用雙緩存技術實現(xiàn)航跡數(shù)據(jù)的組織,降低CPU的計算壓力;利用OpenGL著色器技術實現(xiàn)航跡的繪制,充分發(fā)揮顯卡的高并行處理能力[7-8],從而提升雷達顯控軟件的顯示效率。
OpenGL提供了一組操控顯卡硬件的API,為了提高繪圖效率,OpenGL借鑒了工廠流水線的概念,稱為管線[9]。著色器是運行在GPU上的代碼段,通過著色器可實現(xiàn)對顯卡進行編程。不同的著色器對應管線的不同階段。圖1為OpenGL繪圖管線示意圖。
圖1 OpenGL繪圖管線示意圖Fig.1 OpenGL painting pipeline schematic map
其中統(tǒng)一值為著色器各階段的公用信息。頂點著色器用于處理所要繪制頂點的位置信息,可完成頂點位置的投影變換工作,是OpenGL繪圖所必需的著色器。幾何著色器[10]可一次性對整個圖元(三角形、線、點等)進行處理,可以改變一個圖元的類型,幾何著色器在OpenGL管線中是可有可無的。片段著色器的作用是確定每一個細小片段顏色,是OpenGL繪圖所必需的。GPU中存在很多可編程單元,每個單元都可以執(zhí)行一段著色器程序,OpenGL管線中的著色器都是獨立工作的,因此利用OpenGL著色器繪制航跡具有高并行處理的特點,從而極大提高顯示效率。
本文采用雙緩存技術組織航跡數(shù)據(jù),以降低CPU的處理壓力,提升顯示效率。雙緩存包括后臺緩存和前臺緩存。后臺緩存用于組織航跡數(shù)據(jù),每次組織部分航跡數(shù)據(jù),組織全部數(shù)據(jù)通過多次完成,以減少數(shù)據(jù)組織所帶來的CPU壓力。前臺緩存是指已經(jīng)組織好的數(shù)據(jù),用于界面顯示,以保障界面顯示流暢。每個繪制周期內(nèi)數(shù)據(jù)組織流程如圖2所示。
圖2 基于雙緩存的數(shù)據(jù)組織流程圖Fig.2 Data organization flowchat based on double buffers
1) 判斷是否完成所有航跡數(shù)據(jù)組織工作,若是則翻轉前后臺緩存,保證前臺緩存的數(shù)據(jù)總是完整有效的,同時為下一次后臺緩存組織數(shù)據(jù)做準備。
2) 進入循環(huán)組織數(shù)據(jù),遍歷每一批航跡的所有歷史點進行數(shù)據(jù)組織,直至完成UPDATE_TRK_NUM批航跡。
3) 每個繪制周期最多組織UPDATE_TRK_NUM批航跡數(shù)據(jù),而不是所有目標數(shù),可降低CPU耗時;組織數(shù)據(jù)只在后臺緩存上進行,在完成所有航跡數(shù)據(jù)組織完成之前保證前臺緩存數(shù)據(jù)不變。
4) 一次性將所有前臺緩存數(shù)據(jù)傳送到GPU,完成CPU上的數(shù)據(jù)組織工作,另外CPU與GPU是異步的,因此GPU上繪制所耗費的時間不影響顯示效率。
GPU接收到全部前臺緩存數(shù)據(jù)后,開始對數(shù)據(jù)進行并行處理,處理過程包括頂點著色器和片段著色器。
(1) 頂點著色器代碼如下:
#version 330
uniform highp mat4 matrix;
attribute highp vec4 vertexpos;
attribute highp vec4 vertexcolor;
varying mediump vec4 color;
void main(void)
{
vec4 vertex;
vertex = vec4(0.0,0.0,0.0,1.0);
vertex.x = vertexpos.x;
vertex.y = vertexpos.y;
gl_Position = matrix * vertex;
color = vertexcolor;
}
片段著色器代碼如下:
#version 330
varying mediump vec4 color;
void main(void)
{
gl_FragColor = color;
};
(2) 基于著色器的航跡繪制代碼如下:
_pShardeProgram->setUniformValue(_UniMatAttr, pmvMatrix);
_pShardeProgram->enableAttributeArray(_VerPosAttr);
_pShardeProgram->enableAttributeArray(_VerColorAttr);
_pShardeProgram->setAttributeArray(_VerColorAttr, pVertex->_pColor, 4);
_pShardeProgram->setAttributeArray(_VerPosAttr, pVertex->_pVertex, 2);
glDrawArrays(GL_POINTS, 0, pVertex->_unVertexNum);
_pShardeProgram->disableAttributeArray(_VerColorAttr);
_pShardeProgram->disableAttributeArray(_VerPosAttr);
表1給出了不同目標數(shù)量情況下本文方法與傳統(tǒng)方法航跡顯示幀率(每秒刷新次數(shù))對比結果,結果如下。
表1 航跡顯示幀率實驗結果Tab.1 Experimental results of track display frame rate
從上表結果可以看出,本文方法在航跡顯示效率上相比于傳統(tǒng)方法有了較大提升,大大改善了用戶體驗。
本文提供一種基于OpenGL著色器和雙緩存的雷達航跡高效顯示方法,該方法主要具有三方面優(yōu)勢:第一利用雙緩存每次組織部分數(shù)據(jù)的優(yōu)勢,降低CPU的消耗;第二將組織好的數(shù)據(jù)一次性傳入GPU,減少總線傳輸消耗;第三充分利用GPU高并行特性批量繪制航跡數(shù)據(jù),提高顯示效率。本方法已應用與功能實踐,取得了良好的效果,下一步多線程顯示方面進行更深入的研究和探討。