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