田朝暉,陳 清,石 暢
(中國電子科技集團(tuán)公司第二十八研究所,江蘇南京 210007)
目前很多大型軟件系統(tǒng)采用引擎式設(shè)計(jì),例如搜索系統(tǒng)的搜索引擎[1]、游戲系統(tǒng)的游戲引擎[2]、殺毒軟件的殺毒引擎等,它們都是將核心基礎(chǔ)功能抽離出來形成一個(gè)被稱為引擎的通用部件,實(shí)現(xiàn)組件式開發(fā)與集成、控制系統(tǒng)的運(yùn)轉(zhuǎn)?;谝?,研發(fā)人員可以較為容易地制作相應(yīng)的軟件產(chǎn)品,而不必把資源浪費(fèi)在重復(fù)的基礎(chǔ)功能實(shí)現(xiàn)上。在推演軟件研究方面,一些較為合理的系統(tǒng)[3]、框架[4]設(shè)計(jì)方案被提出,文章以滿足指揮信息系統(tǒng)的需求[5]為目標(biāo),分布式設(shè)計(jì)參考數(shù)據(jù)-業(yè)務(wù)-協(xié)作架構(gòu)[6]。
推演模型中的車輛、飛行器、坦克等作戰(zhàn)單元模型都可視為對現(xiàn)實(shí)物體的模擬稱實(shí)體,記為o。
實(shí)體模型在推演中的某一時(shí)刻有具有它的狀態(tài),使用實(shí)體屬性進(jìn)行描述,將屬性值表示為時(shí)間函數(shù)記為p(t),其中t為推演時(shí)間,將實(shí)體狀態(tài)記為So(t),因此:
將模擬世界本身也視作一個(gè)實(shí)體并包含屬性值,將整個(gè)推演模擬世界記為W,世界狀態(tài)由世界本身屬性與所屬組成實(shí)體屬性組成,有:
Sw(t)是時(shí)間連續(xù)映射,世界狀態(tài)的第tn時(shí)刻取值Sw(tn)確定了該時(shí)刻的世界靜態(tài)信息,Sw(tn)的所包含的信息可唯一確定一個(gè)用于計(jì)算機(jī)屏幕顯示的靜態(tài)圖像。我們把Sw(tn)的值稱為邏輯幀,把由邏輯幀所確定的靜態(tài)圖像稱為顯示幀,一個(gè)邏輯幀為引擎對時(shí)間連續(xù)的世界狀態(tài)的一次采樣。
用一類消息表示導(dǎo)致實(shí)體狀態(tài)轉(zhuǎn)換的作用,在數(shù)學(xué)上對應(yīng)一個(gè)映射,記為e,tn時(shí)刻作用于某實(shí)體的e使得實(shí)體值變換為tn+1時(shí)刻的相應(yīng)屬性新值,故有:
將tn時(shí)刻的模擬世界消息全集記作E,有E={e1,e2,…,eN},于是引擎邏輯幀推進(jìn)模型有:tn+1-tn的值稱為模擬推演時(shí)間步長記作Tstep,Tstep對應(yīng)的真實(shí)時(shí)長稱為邏輯幀周期記作TL,兩個(gè)顯示幀之間的真實(shí)時(shí)長稱作顯示幀周期記為Ts。
推演引擎的核心功能為使模擬世界狀態(tài)按預(yù)定時(shí)間步長推進(jìn)。
推演系統(tǒng)中各個(gè)模擬對象以預(yù)設(shè)的運(yùn)動(dòng)模型、行為模式與規(guī)則、預(yù)設(shè)條件等內(nèi)容根據(jù)當(dāng)前模擬時(shí)刻的實(shí)時(shí)狀態(tài)生成各類消息,通過消息中心驅(qū)動(dòng)推演邏輯幀更新實(shí)現(xiàn)模擬世界狀態(tài)更新。
將消息封裝為對象,依據(jù)關(guān)注事情的不同將消息劃分為不同的類型進(jìn)行相應(yīng)地處理。在每一個(gè)循環(huán)開始,各組件由當(dāng)前的邏輯幀為初始條件,根據(jù)各自的規(guī)則模式生成相關(guān)消息送入消息中間件,在消息分發(fā)與處理結(jié)果匯總過程中采用了分治策略的Fork/Join設(shè)計(jì),使得處理過程支持并行計(jì)算,從而提升推演效率,推演引擎工作流程如圖1所示。
圖1 推演引擎工作流程
時(shí)間推進(jìn)方式采用等模擬時(shí)間步長的方式,即每一輪推演循環(huán)使得推演模擬時(shí)間遞增一個(gè)預(yù)設(shè)步長來控制推演過程。即有tn+1=tn+Tstep,這使得推演時(shí)間值與現(xiàn)實(shí)時(shí)間脫離直接關(guān)聯(lián),控制推演速率僅需要在推演循環(huán)中加入等待時(shí)長參數(shù)即可控制推演速率。因?yàn)轱@示幀數(shù)據(jù)提取自邏輯幀,邏輯幀未變化時(shí)更新顯示幀沒有意義,因此顯示幀周期在max(20毫秒,Tstep)即可滿足視覺需求(假定顯示幀率上限設(shè)置為50 Hz)。幀率控制算法流程如下所示。
0.開始
1.設(shè)定邏輯幀周期為TL,設(shè)定顯示幀周期為Ts,定義變量t0=0,ts0=0;
2.更新邏輯幀獲取當(dāng)前系統(tǒng)時(shí)間戳為t1,當(dāng)t1-t0>TL時(shí)設(shè)置t0=t1,進(jìn)入步驟4,否則進(jìn)入步驟3;
3.推演循環(huán)線程等待TL-(t1-t0);
4.獲取當(dāng)前系統(tǒng)時(shí)間戳為ts1,當(dāng)ts1-ts0>Ts時(shí)更新顯示幀緩沖、設(shè)置ts0=ts1;推演幀內(nèi)數(shù)據(jù)處理、消息分發(fā)、狀態(tài)更新等操作;
5.判斷推演是否結(jié)束,是則進(jìn)入步驟6,否則回到步驟2;
6.結(jié)束。
圖2 推演引擎分布式結(jié)構(gòu)
分布式結(jié)構(gòu)如圖2所示,引擎的消息中間件需要維護(hù)全系統(tǒng)組件引用,因此各節(jié)點(diǎn)需要向消息調(diào)度模塊注冊自身,例如一個(gè)模擬飛行器實(shí)體組件可以簡單地向注冊服務(wù)注冊自身加入推演系統(tǒng),參與收發(fā)消息。模擬實(shí)體組件采用獨(dú)立節(jié)點(diǎn)部署并注冊至消息調(diào)度與服務(wù)中心,通過遠(yuǎn)程過程調(diào)用(RPC方式)獲取數(shù)據(jù),通過消息系統(tǒng)更新狀態(tài)和發(fā)送信息。采用這種設(shè)計(jì)方式,可以配置化實(shí)現(xiàn)組件在系統(tǒng)的加入和移除,實(shí)現(xiàn)推演系統(tǒng)的可伸縮與模塊間低耦合。
針對推演引擎的基本特點(diǎn),節(jié)點(diǎn)數(shù)據(jù)同步策略采用邏輯幀同步,使得系統(tǒng)在一個(gè)邏輯幀周期上實(shí)現(xiàn)最終一致性,即在邏輯幀開始,過程管理系統(tǒng)將邏輯幀分發(fā)至全節(jié)點(diǎn),在邏輯幀結(jié)束過程管理系統(tǒng)接收全節(jié)點(diǎn)的數(shù)據(jù),匯總處理生成下一邏輯幀,保證在一個(gè)新邏輯幀開始后全系統(tǒng)的狀態(tài)基準(zhǔn)最終一致,具體同步過程如圖3所示。
圖3 推演引擎邏輯幀同步過程示意
本文所述的方案推演引擎是推演系統(tǒng)中與推演案例無直接相關(guān)的基礎(chǔ)結(jié)構(gòu),它協(xié)調(diào)控制系統(tǒng)的各組件,根據(jù)預(yù)設(shè)規(guī)則及可配置的參數(shù)逐步推進(jìn)模擬世界實(shí)體組態(tài),其中狀態(tài)更新采用消息驅(qū)動(dòng),并在狀態(tài)演進(jìn)處理中應(yīng)用了分治算法使得系統(tǒng)支持并行計(jì)算,在功能劃分與部署上采用分布式設(shè)計(jì),這使得系統(tǒng)具備可伸縮性與分布式并行計(jì)算的能力。這里僅分析研究了推演引擎的核心部分,實(shí)現(xiàn)完整的推演引擎還有很多內(nèi)容有待研究。