(1.國防科技大學信息系統與管理學院控制科學與工程學科 湖南 長沙 410073; 2.國防科技大學信息系統與管理學院軍信系 湖南 長沙 410073)
基于云繪制技術的VR移動端全景展現研究
胡少雄1蔣杰2
(1.國防科技大學信息系統與管理學院控制科學與工程學科湖南長沙410073; 2.國防科技大學信息系統與管理學院軍信系湖南長沙410073)
隨著虛擬現實技術的發展,面向手機、頭盔等用戶移動終端設備的VR技術漸漸步入到人們的生活當中,廣泛應用在教學、訓練、醫學以及工程設計等各個領域。目前廣泛使用的Oculus、HTC ViVi等VR頭盔都需要連接數據線,對于用戶來說是一個累贅,降低了用戶體驗,而面向手機、無線頭盔等終端的VR設備更加方便,是未來的發展趨勢,然而移動端的設備性能限制著處理更加復雜的場景情況,因此,本文采用面向VR移動端的云繪制渲染框架,將全景圖像傳送給移動端進行展現,不僅能解決移動端性能不足問題,同時實時性和幀率較好,能滿足用戶的大部分需求。
三維虛擬場景;云繪制框架;VR移動端
隨著虛擬現實、增強現實和實時渲染技術的快速發展,面向移動終端的VR/AR頭盔能夠提供移動式、交互式的場景模型渲染,具有良好的發展前景。實時渲染較高的計算復雜度與較大的數據處理規模,影響了面向移動終端的三維展示渲染質量和實時性。為此本文建立面向服務端與移動終端的云繪制渲染模型,設計了面向移動終端的渲染任務分布方法,利用基于RabbitMQ消息隊列的任務分布調度加速三維模型的實時渲染處理,并采集全息圖像傳送給移動端進行展現。本文主要研究以現有分布式渲染方法為基礎,合理調度渲染節點的任務分布問題,提高渲染速度;將虛擬三維場景的全景圖像捕捉,提高渲染速度,生成高質量的全景圖;將全景圖像還原成三維虛擬場景,減少了信息的丟失,提高場景的真實感。
云繪制實質也是分布式并行繪制技術的一種實現形式,云計算繪制模式是在傳統渲染農場的基礎上,將復雜耗時的場景繪制問題放在云環境中來完成的圖形處理方式。
Miao等[1]提出了一種針對移動端的基于自由視點視頻的云繪制協同框架。在該框架中,在確定視點時使用云渲染方式,可以獲得高質量的渲染效果,而在選擇視點時使用本地渲染方式,以降低交互延遲。Wang等[2]提出了一種自適應渲染方式,其比特率隨著動態渲染參數的變化而進行自適應調整。Chua等[3]提出了一種面向移動云游戲的分層編碼方法。游戲圖像幀被分為基礎層和增強層,在客戶端渲染基礎層的圖像,而云服務器上進行增強層圖像和信息的編碼和傳輸。Eisert等[4]提出了一種在局域網中進行遠程游戲的圖形流框架。Huang等[5]提出了一個開源的云游戲系統,提供云服務器渲染和發送流編碼的游戲幀給客戶端。Xiaoming Nan[6]等提出了一種新的協同渲染框架,該框架通過在遠程渲染端內置一個客戶端渲染模擬器,自適應調整遠程渲染和本地渲染。YaoLu等[7]提出了一種聯合非對稱圖像渲染和視頻編碼的方法(JAVRE),其左視圖和右視圖的渲染復雜度與編碼質量都可能是非對稱的。首先,通過主觀和客觀的測試,開發兩個數學模型(用戶體驗模型和視頻比特率模型)。然后,提出了一個優化算法,可以自動選擇視頻編碼設置和圖形渲染設置的左視圖和右視圖,在給定的網絡條件下以確保最佳的用戶體驗。
在服務端的虛擬三維場景中,本文采用任務分布繪制的方法進行場景渲染,運用rabbitmq消息隊列的方法實現任務的調度,提高渲染的速度。采用360度全景攝像機來采集(已經渲染好的虛景)全景圖像視頻,通過socket網絡將采集的全景圖像傳送給客戶端,從而移動端實現虛景的全景展現。當移動端場景用戶移動到另一地點時,綁定移動端虛擬場景攝像機與服務端虛擬場景攝像機,使移動端場景與服務端場景同步,將變換的場景依然變成全景圖像傳送給移動端。同時,移動端VR在場景中設置一些標簽,當某個帶標簽的物體需要改變或置換時,通過將控制標簽的指令傳給服務端,在服務端的虛擬場景中將其進行物體改變或置換,并生成全景圖像傳送給移動端。

圖1 基于云繪制的全景展現總體框架
(一)虛擬場景的全景圖像采集
對于全景展現,一般是采用全景相機拍攝制作成全景圖像,再將全景圖像進行全景展現。本文主要針對虛景的全景展現,這是采用全景相機無法拍攝的,只能通過在虛擬場景中進行全景圖像捕捉,進而獲取全景圖像并進行全景展現。
在一些游戲引擎中(如UE4、unity 3D等),直接從游戲中截取視頻幀不難辦到。然而,在獲取游戲視頻幀時,往往占用很大的計算資源,對整個場景的繪制渲染將會有影響。對于開發VR內容并希望提供良好用戶體驗的人們來說,保持良好的性能是關鍵所在,也是在進行全景展現時幀率的保證。在場景中使用全息攝像機,捕捉360度的全息圖像,并將其進行存儲。
在場景中捕捉幀緩沖區需要獲取整個當前場景的360°的全景信息,并將其轉化為全景圖像,之后復制像素很容易,但這種做法在VR體驗中不可行,該過程運行慢的基本原因如下:
GetPixels()阻塞直到 ReadPixels()完成刷新GPU時,ReadPixels()阻塞每次調用GetPixels()都會分配一個新數組,垃圾回收器導致卡頓。在ReadPixels()和GetPixels()之間設置一幀的延遲就可以避免第一個問題,任何類型的傳輸都將在需要訪問這些值之前完成。
當向GPU發出命令/繪制調用時,這些命令會被批處理到驅動程序中的批量命令緩沖區中。“刷新GPU”意味著等待當前命令緩沖區中的所有命令執行。CPU和GPU可以并行運行,但在GPU刷新時,CPU會保持空閑狀態并等待GPU空閑,這就是它被稱作“同步點”的原因,比較麻煩的是ReadPixels()會導致GPU刷新。
如果每幀執行垃圾回收會產生重大消耗(例如尋找根節點等),這不僅僅關乎于垃圾大小,還與分配的內存有關。實際上垃圾回收是線程安全的,但渲染線程分配任何內存,都會再次阻塞。Unity引擎是唯一需要分配內存的一方,目前不足的地方就是垃圾回收的消耗。
(二)全景圖像合成三維場景及標簽使用
在移動端的虛擬場景中設置一些對象的標簽,當用戶操作這些帶標簽的對象時,將會把操作指令傳回服務端,在服務端的場景對該對象進行相應的操作,并同時生成全息圖像傳送回來。
在設置標簽時,需要將標簽添加到場景中相應的對象中,當移動端場景變化時,服務端的場景也進行了相應的變化。在生成全景圖像時,添加了圖像中一些對象的標簽,且存儲了標簽對象在虛景中的坐標,當移動端對標簽對象進行置換、移動或其他控制指令時,指令會傳回服務端,該標簽對象在服務端的虛景中將會做出置換、移動等相應的操作,完成這些操作后,服務端會再次渲染虛景場景,生成全景圖像傳給移動端進行全景展現。
(三)移動端與服務端的場景同步
為保證移動端和服務端的實時性,需要提高移動端全景展現的幀率,著重從兩個方面進行了優化:(1)采用基于消息隊列的繪制任務調度,加快了渲染速度,從而降低了反應時間。(2)對采集的全景圖像進行了壓縮解壓,降低數據傳輸量。
(一)RabbitMQ消息隊列
RabbitMQ是一款基于AMQP(消息隊列協議),由Erlang開發的開源消息隊列組件,由兩部分組成:服務端和客戶端,客戶端支持多種語言的驅動,如:.Net、JAVA、Erlang等。

圖2 RabbitMQ結構示意圖
RabbitMQ中間件分為服務端(RabbitMQ Server)和客戶端(RabbitMQ Client),服務端可以理解為是一個消息的代理消費者,客戶端又分為消息生產者(Producer)和消息消費者(Consumer)[8]。消息生產者(Producer):主要生產消息并將消息基于TCP協議,通過建立Connection和Channel,將消息傳輸給RabbitMQ Server,對于Producer而言基本就完成了工作。服務端(RabbitMQ Server):主要負責處理消息路由、分發、入隊列、緩存和出列,主要由三部分組成:Exchange、RoutingKey、Queue。消息消費者(Consumer):主要負責消費Queue的消息,同樣基于TCP協議,通過建立Connection和Channel與Queue傳輸消息,一個消息可以發送給多個Consumer消費。
(二)基于RabbitMQ消息隊列的繪制任務調度
繪制任務流水線分為幾何處理和光柵化兩部分[9],在幾何處理階段中,主要分為命令處理、幾何變換、光照處理、投影變換、裁剪處理與視窗映射等處理過程。光柵化處理就是把頂點數據轉換為片元的過程,片元中的每一個元素對應于幀緩沖區中的一個像素,光柵化處理將幾何處理階段產生的幾何圖元變為二維圖像。
在云繪制環境下,將用戶的繪制作業分割成若干個相應的繪制子任務,其中每個繪制子任務都保留了原本父繪制作業的參數信息,因此,用戶所提交的繪制作業在實際處理時還有繪制子任務,對這批具有相同父作業的子任務進行分布式并行繪制,然后將繪制結果進行圖像合成處理得到最終場景。云繪制正是通過一個分割與合成的處理達到大規模場景的快速繪制效果。由于存在這個分割—執行—合成的流程,則在某個作業最后的圖像合成時,需要等到這批子任務全部執行完才能進行合成處理,即只有在這個批次的各個繪制子任務的全部完成才表示整個作業繪制的結束,而在這些子任務的執行過程中,用時最長、完成時間晚的子任務將對整個作業的繪制時間起到決定性作用[10]。因此,在一些實時繪制或者對時間要求比較高的情況下,任務的調度不僅要滿足大多數任務的執行時間最短,而且要保證子任務中執行用時最長的任務盡可能快的被完成,將某批次作業中完成最晚,所需執行時間最多的任務稱為本次作業的關鍵任務,如圖2所示:

圖3 基于rabbitmq消息隊列的繪制任務調度
圖3中,關鍵任務的完成時間就是t4。采用rabbitmq對繪制任務進行調度分配,可以實現在集群之間進行集群繪制,加快了渲染速度,分布利用了集群之間的資源,能實現對大規模場景的渲染。
本文針對VR移動端難以負載大規模場景的渲染問題,研究面向移動端的云繪制全景展現,采用服務端渲染場景,采集場景全景圖像信息并進行全景展現,同時針對大規模場景中繪制任務的數據量大、計算復雜以及耗時等問題,研究了基于RabbitMQ消息隊列的渲染任務的分布調度,并在集群分布式并行繪制中得到實現與應用。
目前的VR頭盔通常需要與電腦連接數據線,限制了用戶使用VR頭盔的活動范圍,而面向VR移動端的虛擬場景全景展現,能解決這一不足,擺脫數據線的困擾,同時面向VR移動端的全景展現可以在旅游業、房源觀看、城市導航等許多方面能得到較好的應用。
根據目前研究工作的分析,下一步主要工作可以在以下幾個方面進行深入的研究:
(1)場景繪制更深層次的研究。云繪制所面臨的是圖形繪制問題,為了實現更好的分布式并行繪制目的,需要對場景的分割算法作進一步的研究,對各個繪制任務之間的依賴關系進行合理的處理。且繪制任務調度算法需進一步實驗,改進分布集群渲染算法,提高渲染速度。
(2)對場景的改變及時作出反應。當移動端控制場景變化時,服務端能快速得到這一指令并作出反應,在提高渲染算法速度時,能有效減少反應延遲,讓用戶感覺不到停頓感或切換,保證全景展現的幀率。
(3)添加一定范圍的全景展現移動路徑。
全景展現一般是定點的,可以生成一定范圍內的移動路徑的全景圖像,從而可以在一定范圍內進行全景展現,而不僅僅是定點展現。
[1]D.Miao,W.Zhu,C.Luo,and C.Chen,“Resource allocation for cloudbased free viewpoint video rendering for mobile phones,” in Proc.of ACM MM,2011,pp.1237-1240.
[2]S.Wang and S.Dey,“Adaptive mobile cloud computing to enable rich mobile multimedia applications,” IEEE TMM,vol.15,no.4,pp.870- 883,2013.
[3]S.-P.Chuah and N.-M.Cheung,“Layered coding for mobile cloud gaming,” in Proc.of ACM MMVE,2014,pp.1-6.
[4]P.Eisert and P.Fechteler,“Low delay streaming of computer graphics,” in Image Processing,2008.ICIP 2008.15th IEEE International Conference on.IEEE,2008,pp.2704-2707.
[5]C.-Y.Huang,C.-H.Hsu,Y.-C.Chang,and K.-T.Chen,“Gaminganywhere:an open cloud gaming system,” in Proc.of ACM MMSys,2013,pp.36-47.
[6]Xiaoming Nan,Yifeng He,Ling Guan,Delay-rate-distortion Optimization for Cloud-based Collaborative Rendering,Department of Electrical and Computer Engineering Ryerson University,Toronto,Ontario,Canada
[7]Yao Lu,Student Member,IEEE,and Sujit Dey,JAVRE:A Joint Asymmetric Video Rendering and Encoding Approach to Enable Optimized Cloud Mobile 3D Virtual Immersive User Experience,Fellow,IEEE
[8]彭浩宇.基于PC集群機的并行圖形繪制系統研究[D].浙江大學,2006.
[9]李松.開源云計算平臺管理支撐平臺的研究與實現[D].山東大學,2013.
[10]常運啟.云繪制環境下實時動態任務調度算法研究[D].浙江工商大學,2015
胡少雄(1993.1-),男,漢族,湖南常寧人,碩士研究生在讀,本科,國防科技大學信息系統與管理學院,研究方向多媒體與虛擬現實。