于雷易,邴丕敬,楊永明
(1.自然資源部國土空間大數(shù)據(jù)工程技術(shù)創(chuàng)新中心應(yīng)用技術(shù)研發(fā)分中心,北京 100034;2.特力惠信息科技股份有限公司,福州 350001;3.中國人民大學(xué) 研究生院,北京 100872;4.中國人民大學(xué) 勞動人事學(xué)院,北京 100872)
基于Web 方式的三維場景數(shù)據(jù)在線顯示是地理信息系統(tǒng)技術(shù)的常規(guī)需求,基于三維地理瓦片(three dimensions tiles,3D Tiles)格式實(shí)現(xiàn)三維場景數(shù)據(jù)在線顯示的Cesium 技術(shù)是該領(lǐng)域的代表技術(shù)。Cesium 技術(shù)實(shí)現(xiàn)三維場景數(shù)據(jù)在線顯示的關(guān)鍵是3D Tiles 格式的分層細(xì)節(jié)級別(hierarchical level of detail,HLOD)數(shù)據(jù)結(jié)構(gòu)。用戶請求顯示某視圖范圍內(nèi)的三維場景數(shù)據(jù)時,Cesium 首先向服務(wù)端請求加載顯示HLOD 數(shù)據(jù)結(jié)構(gòu)的低層級數(shù)據(jù),由于低層級數(shù)據(jù)的數(shù)據(jù)量相對少,這樣能夠快速顯示三維場景的輪廓、快速響應(yīng)用戶的顯示請求;當(dāng)用戶沒有進(jìn)一步視圖操作時,再逐級加載顯示HLOD數(shù)據(jù)結(jié)構(gòu)的高層級數(shù)據(jù),顯示三維場景的細(xì)節(jié)[1]。
雖然Cesium 技術(shù)能夠解決一般情況下的三維場景在線顯示問題,但也存在缺陷。Cesium 技術(shù)顯示三維場景數(shù)據(jù)時需要將數(shù)據(jù)傳輸?shù)娇蛻舳瞬⑦M(jìn)行渲染。當(dāng)三維場景地理范圍很大且場景細(xì)節(jié)特別豐富時,高層級HLOD 數(shù)據(jù)傳輸?shù)娇蛻舳撕臅r很長,造成三維場景細(xì)節(jié)顯示緩慢;傳輸?shù)娇蛻舳说娜S場景數(shù)據(jù)會造成大量內(nèi)存累積,即便它擁有內(nèi)存釋放策略也無法完全解決問題,導(dǎo)致中低性能的客戶端極易出現(xiàn)瀏覽器崩潰等問題[1]。
為解決上述海量、高密度、高精度三維場景數(shù)據(jù)在線可視化問題,研究團(tuán)隊(duì)研發(fā)了一種海量三維場景數(shù)據(jù)混合渲染方法并取得發(fā)明專利,基于該專利技術(shù)實(shí)現(xiàn)了TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)。
在Web 的三維場景數(shù)據(jù)渲染技術(shù)方面,Cesium的細(xì)節(jié)層次(level of detail,LOD)技術(shù)和虛幻引擎(Unreal Engine)的像素流送技術(shù)是典型代表。一些商業(yè)三維地理信息系統(tǒng)平臺推出視頻流的技術(shù),其技術(shù)實(shí)現(xiàn)原理與像素流送技術(shù)類似。
Cesium 是AGI(Analytical Graphics Incorporation)公司計(jì)算機(jī)圖形開發(fā)小組研發(fā)的三維地球和地圖可視化開源JavaScript 庫。Cesium 為三維GIS 提供了一個高效的數(shù)據(jù)可視化平臺。Cesium 是一個跨平臺、跨瀏覽器展示三維地球和地圖的JavaScript庫;利用萬維網(wǎng)圖形庫(Web graphics library,WebGL)進(jìn)行硬件加速圖形顯示,使用時不需要任何插件支持。
Cesium 技術(shù)運(yùn)用3D Tiles 格式加載傾斜攝影數(shù)據(jù)、三維建筑物模型數(shù)據(jù)、建筑信息模型(building information model,BIM)數(shù)據(jù)、點(diǎn)云數(shù)據(jù)等3D 數(shù)據(jù)。Cesium 支持全球高精度地形數(shù)據(jù)可視化,支持地形夸張效果、可編程實(shí)現(xiàn)的等高線和坡度分析效果。
Unreal Engine 的像素流送技術(shù),在云端服務(wù)器上運(yùn)行虛幻引擎應(yīng)用程序,通過萬維網(wǎng)實(shí)時通信(Web real-time communication,WebRTC),將渲染的幀和音頻流發(fā)送到瀏覽器和移動設(shè)備[2]。
利用像素流送可以遠(yuǎn)程運(yùn)行虛幻引擎應(yīng)用程序,虛幻引擎將利用電腦的可用資源,包括中央處理器(central processing unit,CPU)、圖形處理單元(graphics processing unit,GPU)、內(nèi)存等,運(yùn)行游戲邏輯并對每一幀進(jìn)行渲染。它會將此渲染不斷輸出編碼到一個媒體流送,再通過一個輕量級的網(wǎng)頁服務(wù)堆棧進(jìn)行傳遞,用戶可在其他電腦和移動設(shè)備的標(biāo)準(zhǔn)網(wǎng)頁瀏覽器查看直播流送[2]。
TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)的核心方法是客戶端與服務(wù)端混合渲染方法。該方法的具體實(shí)現(xiàn)過程采用了HLOD 層級瓦片篩選規(guī)則[3]、三級緩存策略、多用戶并發(fā)與分布式渲染任務(wù)分配等多個關(guān)鍵技術(shù)。
不同于Cesium 技術(shù)的客戶端渲染方法,海量三維場景數(shù)據(jù)混合渲染方法采用了客戶端與服務(wù)端混合渲染的方法。該混合渲染方法的基本原理是,客戶端Cesium 負(fù)責(zé)加載顯示3D Tiles 數(shù)據(jù)HLOD 數(shù)據(jù)結(jié)構(gòu)的低層級數(shù)據(jù)(低層級數(shù)據(jù)的數(shù)據(jù)量相對?。@示三維場景的輪廓,滿足用戶視圖操作的快速響應(yīng)和平滑效果需求;服務(wù)端的osgEarth 集群負(fù)責(zé)顯示HLOD 數(shù)據(jù)結(jié)構(gòu)的高層級數(shù)據(jù)(高層級數(shù)據(jù)的數(shù)據(jù)量相對大),顯示三維場景的細(xì)節(jié)。
該混合渲染方法既能減少客戶端的數(shù)據(jù)壓力和資源壓力(降低了客戶端電腦的指標(biāo)要求),保證用戶視圖操作的快速響應(yīng)和平滑效果,又能通過調(diào)用服務(wù)端osgEarth 集群的分布式并行渲染能力,滿足三維場景細(xì)節(jié)快速顯示的需求。
在客戶端與服務(wù)端混合渲染方法的具體實(shí)現(xiàn)方面,服務(wù)端不需要參與每個視圖的渲染。本文通過HLOD 層級瓦片篩選規(guī)則確定客戶端負(fù)責(zé)渲染情況與服務(wù)端負(fù)責(zé)渲染情況。
在3D Tiles 數(shù)據(jù)HLOD 數(shù)據(jù)結(jié)構(gòu)中,每個層級都帶有一個屬性geometricError,根據(jù)該屬性和當(dāng)前視圖參數(shù),可以計(jì)算對應(yīng)的屏幕誤差ScreenSpaceError。
本文設(shè)定一個最大屏幕誤差(Maximum ScreenSpaceError)、一個層級遞減系數(shù)(Screen SpaceErrorScale)、一個最高層級幾何誤差(GeometricErrorMax),將混合渲染標(biāo)識(DisplayType)的初始值設(shè)為0。最大屏幕誤差、層級遞減系數(shù)及最高層級幾何誤差的取值分別舉例為16 個像素、4 及32 m[1]。
對于每次三維視圖刷新操作,客戶端瀏覽器需要遍歷3D Tiles 數(shù)據(jù)HLOD 數(shù)據(jù)結(jié)構(gòu)[4],對每個層級的ScreenSpaceError 進(jìn)行計(jì)算,并且按照如下規(guī)則進(jìn)行篩選和操作:
(1)當(dāng)幾何誤差大于或等于最高層級幾何誤差時,判斷屏幕誤差是否小于最大屏幕誤差。若小于,則設(shè)定層級瓦片的顯示標(biāo)識為不顯示,不修改混合渲染標(biāo)識的值。若大于或等于,則設(shè)定層級瓦片的顯示標(biāo)識為顯示,不修改混合渲染標(biāo)識的值[1]。
(2)當(dāng)幾何誤差小于最高層級幾何誤差時,判斷屏幕誤差是否小于最大屏幕誤差。若小于,則設(shè)定層級瓦片的顯示標(biāo)識為不顯示,不修改混合渲染標(biāo)識的值。若大于或等于,則將屏幕誤差除以層級遞減系數(shù)并得到誤差值(error),判斷誤差值是否大于或等于最大屏幕誤差。若大于,則設(shè)定層級瓦片的顯示標(biāo)識為顯示,不修改混合渲染標(biāo)識的值;若小于或等于,則設(shè)定層級瓦片的顯示標(biāo)識為不顯示,將混合渲染標(biāo)識的值改為1[1]。
混合渲染標(biāo)識用于決定是否啟動服務(wù)端渲染。當(dāng)所述混合渲染標(biāo)識的值為0 時,客戶端進(jìn)行渲染;當(dāng)所述混合渲染標(biāo)識的值為1 時,客戶端負(fù)責(zé)低層級數(shù)據(jù)渲染,同時啟動服務(wù)端渲染,服務(wù)端負(fù)責(zé)高層級數(shù)據(jù)渲染,同時附帶必要的低層級數(shù)據(jù)[1]。
上述層級瓦片篩選規(guī)則如表1 所示。
表1 層級瓦片篩選規(guī)則
通過以上計(jì)算和篩選規(guī)則,實(shí)現(xiàn)客戶端Cesium 負(fù)責(zé)加載顯示3D Tiles 數(shù)據(jù)HLOD 數(shù)據(jù)結(jié)構(gòu)的低層級數(shù)據(jù)、服務(wù)端osgEarth 集群負(fù)責(zé)顯示HLOD 數(shù)據(jù)結(jié)構(gòu)的高層級數(shù)據(jù)。
服務(wù)端分布式并行渲染是客戶端與服務(wù)端混合渲染方法的實(shí)現(xiàn)關(guān)鍵。服務(wù)端分布式并行渲染需要消息觸發(fā)并行渲染任務(wù),將完成的結(jié)果圖片傳回客戶端瀏覽器,這個過程比較復(fù)雜,本文通過三級緩存策略實(shí)現(xiàn)了解耦,使得渲染流程更加穩(wěn)健[5]。三級緩存策略的具體實(shí)現(xiàn)過程參見下文的系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)章節(jié)。
TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)不僅要實(shí)現(xiàn)單個用戶任務(wù)的分布式并行渲染,還要實(shí)現(xiàn)多用戶并發(fā)請求的響應(yīng)。為此,本系統(tǒng)通過配置文件設(shè)置每個渲染節(jié)點(diǎn)啟動osgEarth 的最大實(shí)例數(shù)量和每個3D Tiles 數(shù)據(jù)需要的并行渲染osgEarth 實(shí)例數(shù)量,根據(jù)渲染節(jié)點(diǎn)數(shù)量明確當(dāng)前渲染集群支撐的最大用戶并發(fā)數(shù)量[6]。
當(dāng)用戶并發(fā)數(shù)量不超過最大數(shù)量時,正常啟動新的osgEarth 實(shí)例,響應(yīng)新用戶的數(shù)據(jù)渲染請求;當(dāng)用戶并發(fā)數(shù)量超過最大數(shù)量時,告知當(dāng)前用戶集群已經(jīng)滿負(fù)荷,暫時無法提供服務(wù)。另外,當(dāng)用戶長時間沒有操作時,服務(wù)端對應(yīng)的osgEarth實(shí)例會被銷毀,釋放的資源被提供給其他用戶。
TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)結(jié)構(gòu)如圖1 所示。TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)主要由客戶端瀏覽器、服務(wù)端Cesium 網(wǎng)頁服務(wù)、服務(wù)端3D Tiles 數(shù)據(jù)服務(wù)、服務(wù)端并行渲染服務(wù)、服務(wù)端osgEarth 集群5 個部分組成。其中,服務(wù)端Cesium 網(wǎng)頁服務(wù)、服務(wù)端3D Tiles 數(shù)據(jù)服務(wù)是Cesium 技術(shù)本身的設(shè)計(jì),主要實(shí)現(xiàn)客戶端渲染任務(wù);服務(wù)端并行渲染服務(wù)、服務(wù)端osgEarth 集群是本系統(tǒng)的自定義設(shè)計(jì),主要實(shí)現(xiàn)服務(wù)端渲染任務(wù)。以上組成結(jié)構(gòu)負(fù)責(zé)完成下文的顯示操作響應(yīng)處理流程。
圖1 TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)結(jié)構(gòu)
TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)典型的顯示操作響應(yīng)處理流程如圖2 所示。
圖2 顯示操作響應(yīng)處理流程
(1)網(wǎng)頁初始化和渲染服務(wù)初始化??蛻舳送ㄟ^瀏覽器訪問服務(wù)端的Cesium 網(wǎng)頁,獲得Cesium JavaScript 三維數(shù)據(jù)處理能力,并通過3D Tiles 數(shù)據(jù)服務(wù)加載三維場景數(shù)據(jù),完成Cesium 網(wǎng)頁的初始化[1]。在Cesium 網(wǎng)頁上創(chuàng)建一個等大窗口的畫布,響應(yīng)用戶視圖的操作和請求,并開啟混合渲染模式,完成渲染服務(wù)的初始化[1]。
(2)通過層級瓦片篩選規(guī)則實(shí)現(xiàn)混合渲染控制。客戶端根據(jù)用戶的視圖操作,基于三維場景數(shù)據(jù)中各層級瓦片的幾何誤差(geometricError)計(jì)算對應(yīng)的屏幕誤差(ScreenSpaceError)?;谏衔乃龅膶蛹壨咂Y選規(guī)則,對混合渲染標(biāo)識displayType 進(jìn)行更新,并決定是否啟動服務(wù)端渲染。當(dāng)混合渲染標(biāo)識displayType 的值為0 時,客戶端進(jìn)行渲染;當(dāng)混合渲染標(biāo)識displayType 的值為1 時,客戶端負(fù)責(zé)低層級數(shù)據(jù)渲染,同時啟動服務(wù)端渲染。
(3)服務(wù)端分布式并行渲染。服務(wù)端接收所述數(shù)據(jù)渲染請求后,對三維場景數(shù)據(jù)中的高層級數(shù)據(jù)和必需的低層級數(shù)據(jù)進(jìn)行并行渲染,并基于三級緩存策略將渲染結(jié)果刷新到客戶端,完成三維場景數(shù)據(jù)的混合渲染。
客戶端調(diào)用cesiumWidget.scene.render 方法對三維場景數(shù)據(jù)的低層級數(shù)據(jù)進(jìn)行渲染。當(dāng)所述混合渲染標(biāo)識的值為1 且距離上一次視圖參數(shù)變化超過預(yù)設(shè)的第一時間間隔(如50 ms)后,基于用戶選擇的數(shù)據(jù)信息和視圖參數(shù)向服務(wù)端發(fā)送數(shù)據(jù)渲染請求。通過第一時間間隔updateViewpoint方法設(shè)置,避免用戶視圖頻繁變化,不斷向服務(wù)端發(fā)送高層級數(shù)據(jù)渲染請求,進(jìn)而降低服務(wù)端的壓力[1]。
服務(wù)端接收所述數(shù)據(jù)渲染請求后,清空服務(wù)端的任務(wù)隊(duì)列,新建若干個三維場景渲染子任務(wù)并添加至任務(wù)隊(duì)列,基于所述任務(wù)隊(duì)列將三維場景渲染子任務(wù)分配給若干個worker 進(jìn)程并進(jìn)行并行處理[1]。
新建若干個三維場景渲染子任務(wù)的原因是osgEarth 顯示三維場景是一個漸進(jìn)式顯示過程,需要在特定時間內(nèi)不斷從osgEarth 獲取渲染完成的渲染子圖片[1]。
各個worker 進(jìn)程接收三維場景渲染子任務(wù)后,基于三維場景渲染子任務(wù)判斷數(shù)據(jù)信息和視圖參數(shù)是否變化。若變化,則更新osgEarth 的參數(shù)信息,從三級緩存中抓取對應(yīng)的渲染子圖片,并將渲染子圖片匯總到服務(wù)端的二級緩存;若不變化,則從三級緩存中抓取對應(yīng)的渲染子圖片,并將渲染子圖片匯總到服務(wù)端的二級緩存[1]。
客戶端基于預(yù)設(shè)的第二時間間隔(如300 ms),將服務(wù)端二級緩存中存儲的渲染子圖片,通過WebService 請求循環(huán)刷新到客戶端的一級緩存,客戶端通過一級緩存中存儲的渲染子圖片不斷更新畫布的顯示內(nèi)容,完成三維場景數(shù)據(jù)的混合渲染[1]。
一級緩存有利于客戶端即時響應(yīng)用戶視圖的操作;二級緩存有利于解耦服務(wù)端三維場景數(shù)據(jù)的渲染流程和客戶端向服務(wù)端請求渲染子圖片的流程,各自按照實(shí)際需求確定刷新頻次,使得服務(wù)端的數(shù)據(jù)渲染請求響應(yīng)過程更加合理,提高整體渲染響應(yīng)性能;三級緩存有利于實(shí)現(xiàn)服務(wù)端漸進(jìn)式顯示,充分利用osgEarth 固有能力。
基于系統(tǒng)設(shè)計(jì),本文在3 個節(jié)點(diǎn)的虛擬機(jī)集群上進(jìn)行了系統(tǒng)實(shí)驗(yàn),并且導(dǎo)入了測試數(shù)據(jù),進(jìn)行了數(shù)據(jù)可視化測試。
虛擬機(jī)集群節(jié)點(diǎn)資源配置如表2 所示。測試數(shù)據(jù)是某地區(qū)約10 km2的三維場景數(shù)據(jù),總數(shù)據(jù)量約30 GB。
表2 虛擬機(jī)集群節(jié)點(diǎn)資源配置
三維場景數(shù)據(jù)可視化結(jié)果如圖3 所示。數(shù)據(jù)可視化測試表明,本系統(tǒng)能夠完成海量、高密度、高精度的三維場景數(shù)據(jù)在線可視化任務(wù)。
圖3 三維場景數(shù)據(jù)可視化結(jié)果
對于上述同樣的三維場景數(shù)據(jù),本文通過原生的Cesium 技術(shù)進(jìn)行了可視化測試。測試結(jié)果表明,Cesium 技術(shù)雖然能夠正常顯示該三維場景數(shù)據(jù),但場景細(xì)節(jié)放大時,場景細(xì)節(jié)漸進(jìn)式顯示耗時較長,通常需要數(shù)秒。在不同場景區(qū)域漫游過程中,客戶端內(nèi)存不斷累積,最終導(dǎo)致瀏覽器崩潰。
與本文所述的客戶端與服務(wù)端混合渲染方法相比,Cesium 技術(shù)使用客戶端渲染方法,前文已經(jīng)進(jìn)行技術(shù)對比。Unreal Engine 的像素流送技術(shù)也是三維場景數(shù)據(jù)在線可視化的一種主流技術(shù)[7]。與像素流送技術(shù)相比,本文的客戶端與服務(wù)端混合渲染方法主要存在2 個優(yōu)勢。
(1)客戶端的低層級數(shù)據(jù)渲染保證了用戶交互的流暢性。像素流送技術(shù)雖然通過使用WebRTC點(diǎn)對點(diǎn)通信框架,實(shí)現(xiàn)使用者和虛幻引擎應(yīng)用程序之間低延遲,但用戶交互還存在延遲,這是因?yàn)樗械捻憫?yīng)都來自服務(wù)端。
(2)服務(wù)端的分布式并行渲染保證了系統(tǒng)的可擴(kuò)展性。TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)通過集群的并行渲染,使得系統(tǒng)可以無限制支撐三維場景數(shù)據(jù)量和密度,無限制支撐客戶端用戶數(shù)量。Unreal Engine 的像素流送技術(shù)在這兩個方面都受制于單一服務(wù)端節(jié)點(diǎn)的硬件資源配置,不能通過集群進(jìn)行擴(kuò)展[8]。
本文的客戶端與服務(wù)端混合渲染方法的主要劣勢是實(shí)現(xiàn)過程較復(fù)雜,包括服務(wù)端的集群調(diào)度過程,為系統(tǒng)的編碼實(shí)現(xiàn)和部署帶來一定的困難,系統(tǒng)運(yùn)行的穩(wěn)定性也有待檢驗(yàn)。
本文通過關(guān)鍵技術(shù)研究、系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)、系統(tǒng)實(shí)驗(yàn)與測試及同類技術(shù)對比,證明了客戶端與服務(wù)端混合渲染方法的可行性和優(yōu)越性。
TeleGIS 三維大數(shù)據(jù)Web 顯示系統(tǒng)的實(shí)驗(yàn)和測試基于虛擬機(jī)集群,如果基于裝有GPU 顯卡的物理機(jī)集群進(jìn)行系統(tǒng)部署,將能夠極大地提升系統(tǒng)顯示性能,包括三維場景數(shù)據(jù)顯示速度及數(shù)據(jù)量和用戶量的支撐能力。