項朝陽 喬樑 鐘瑜 段丹萍 賀昉
摘? 要:基于LinkVR適配技術,構建沉浸式虛擬現(xiàn)實場景;針對場景的布局、結構和特點,運用Profile等相關手段進行性能分析,尋找主機資源消耗的關鍵點;通過烘焙、遮擋剔除和LOD等技術手段,對虛擬場景進行優(yōu)化。文章以虛擬ICU為案例,敘述了一種沉浸式場景的構建方式,總結了對沉浸式復雜場景進行性能優(yōu)化的關鍵技術。
關鍵詞:虛擬現(xiàn)實技術;沉浸式;復雜場景構建
中圖分類號:TP391 ? ? ?文獻標識碼:A 文章編號:2096-4706(2021)05-0093-05
Construction and Optimization of Immersive Complex Scenario Based on LinkVR
——Take the Construction of a Virtual ICU Scenario as an Example
XIANG Chaoyang,QIAO Liang,ZHONG Yu,DUAN Danping,HE Fang
(Guangdong Food and Drug Vocational College,Guangzhou? 510520,China)
Abstract:LinkVR adaptation technology can be used to construct an immersive virtual reality scenario. Aimming at the layout,structure and characteristics of the scenario,the key points of host resource consumption would be found with the performance analysis using Profile and other related means. The virtual scenario is optimized by baking,occlusion elimination and LOD and other technology means. In this paper,taking virtual ICU as an example,the construction way of immersive scenario is narrated,and the key technology for the performance optimization of immersive complex scenarios is summarized.
Keywords:virtual reality technology;immersive;complex scenario construction
0? 引? 言
在過去幾年里,一股沉浸式體驗熱潮正在世界各地蔓延。制作精良的沉浸式場景能帶來顛覆感官的體驗效果,但對主機資源的消耗也是巨大的。隨著場景復雜度的提升,如何控制和減少主機資源的消耗,確保程序的流暢運行,對沉浸式復雜場景的構建至關重要。營造沉浸式場景的關鍵在于確保足夠的FPS,虛擬場景里的FPS與動畫的幀類似,只是虛擬場景里的圖像被畫到了屏幕,畫一幀到屏幕被稱為渲染一幀,渲染的速度以每秒渲染的幀數(shù)來衡量?,F(xiàn)在大多數(shù)虛擬場景都是以60 FPS為目標,當?shù)陀?0 FPS時,圖像可能會卡頓,用戶體驗下降。對于沉浸式場景,更要確保足夠而穩(wěn)定的FPS才能擁有良好的體驗效果。
本案例設計的虛擬ICU包括病房(分為普通病房和器官移植病房)、護士站、治療室、醫(yī)護辦公室、儀器室、庫房、打包間、消毒間、污物處理間,以及病人通道、醫(yī)護通道和探視通道等區(qū)域,每個區(qū)間配置各種醫(yī)療設施,病房內配有多功能吊橋、心電監(jiān)護儀、呼吸機、除顫儀、輸液泵、注射泵及空氣層流過濾裝置等設備。對于這樣一個沉浸式場景的構建,從模型構造、渲染模式選擇、抗鋸齒、烘焙處理、遮擋與剔除和LOD等環(huán)節(jié)均必須采取相應的技術手段和措施,降低資源消耗,提升渲染效率,確保虛擬場景流暢并穩(wěn)定地運行。
1? 工程文件創(chuàng)立
1.1? 場景模型構建
影響沉浸式場景最終運行速度的三大因素為VR場景模型的總面數(shù)、VR場景模型的總個數(shù)、VR場景模型的總貼圖量。貼圖像素影響顯示的清晰度,其數(shù)量受到場景需求的影響,故著重控制VR場景模型的總面數(shù)和VR場景模型的總個數(shù)。ICU是一個對溫度、濕度和空氣潔凈度都有嚴格要求的獨立空間,包括普通病房區(qū)、器官移植區(qū)和醫(yī)護工作區(qū)域,通過病人通道、醫(yī)護通道和探視通道與外界連通,如圖1所示。
虛擬ICU建模分為建筑區(qū)域、基礎設施和治療設備三個部分,遵循VR場景一般性的建模規(guī)范和標準實施建模,基礎建模完成后,模型個數(shù)為260,面數(shù)達25萬,遠遠超出虛擬仿真的極限范圍。為大幅降低計算機的資源消耗,采購以下措施對基礎模型進行處理:
(1)模型個數(shù)的精簡。將相同材質的物體分別賦好材質,調整好各自的貼圖坐標,再將這些相同材質的物體進行合并以減少模型個數(shù)。在3dsMax里,主要采取兩種方法合并模型,一是采用Attach(合并)命令精簡模型個數(shù);二是利用Collapse(塌陷)命令精簡模型個數(shù)。
(2)模型面數(shù)的精簡。從以下方面對模型進行精簡和優(yōu)化,包括Plane(面片)模型面的精簡、Cylinder(圓柱)模型面的精簡、Line(線)模型面的正確創(chuàng)建、曲線形狀模型的創(chuàng)建及面數(shù)精簡、刪除模型之間的重疊面、刪除模型頂部或底部看不見的面、刪除物體之間相交的面、單面窗框的創(chuàng)建、復雜鏤空模型的表現(xiàn)方法;另外,刪除人物、被子和枕頭等復雜模型里看不見的面,移除多余的點。
上述精減工作完成后,模型個數(shù)降到70個,面數(shù)減至15萬。
1.2? Unity工程創(chuàng)立
1.2.1? 模型導入
將從3dsMax導出的FBX文件導入Unity工程,為地面、墻體和大型設備等設置碰撞體,主攝影機添加漫游腳本,設置剛體和碰撞體,實現(xiàn)碰撞檢測,如圖2所示。
1.2.2? 燈光布置
虛擬ICU場景面積大、房間多,且包含大量醫(yī)療設施和器械模型,為獲得均勻的光照效果,需布置大量的燈光,導致場景渲染壓力過大,當改變場景查看視角時,出現(xiàn)強烈的滯后和頓挫感。為兼顧運行效率和渲染效果,本案例采用兩種技術手段進行處理,一是對燈光進行烘焙,降低實時渲染壓力;二是在場景大門、可控燈光等關鍵位置布置混合模式燈光,啟動陰影,并限制其只照射在地板、墻體等呈現(xiàn)陰影的物體上,在控制資源消耗的前提下使場景生動一些。
1.2.3? 烘焙處理
通過烘焙技術將反射光和陰影記錄到模型中,變成新的貼圖,在程序運行時,顯卡和CPU不需要對環(huán)境光進行運算,大幅節(jié)約了CPU的資源。在工程里Edit-Project Settings- Quality,Pixel Light Count下設置場景燈光總數(shù),參與烘培的物體選擇“Lightmap Static”和“Generate Lightmap”,參與烘培的燈光勾選“baked”且Spotlight不設置陰影,打開Window-Lighting-Settings,勾選“Auto Generate”,當調整燈光后會自動更新烘焙貼圖,這將有利于后期對燈光的調整和優(yōu)化,點擊“Generate Lighting”后,在Assets下將自動生成一個文件夾LED-roam,此處存儲烘焙產(chǎn)生的貼圖。
2? 沉浸式場景構建
2.1? LinkVR簡介
LinkVR是一款虛擬現(xiàn)實內容適配軟件。該軟件提供了UnitySDK以及用于沉浸式環(huán)境VR內容開發(fā)的接口(C#的APIs),可幫助Unity3D內容創(chuàng)作者和體驗者將制作的內容適配到虛擬現(xiàn)實沉浸式環(huán)境中,支持虛擬現(xiàn)實沉浸式環(huán)境、立體顯示、追蹤交互、三維手柄和多通道集群系統(tǒng),提供了一個可視化的界面用來配置硬件環(huán)境和管理VR內容,搭配光學追蹤系統(tǒng)對內容進行沉浸式交互體驗,也可以幫助用戶針對頭戴式顯示器進行基于真實物理空間的定位,支持多人虛擬與現(xiàn)實的相對位置關系一致的本地協(xié)同交互。
LinkVR軟件分為LinkVR客戶端、LinkVR監(jiān)聽端和LinkVR Unity SDK三個部分,客戶端主要用于針對虛擬現(xiàn)實沉浸式環(huán)境的硬件進行配置,包括實際屏幕的數(shù)量、寬度和高度、空間位置和旋轉角度、追蹤系統(tǒng)的IP地址等。生成配置文件后,用戶可以選擇生成后的配置文件,一鍵分發(fā)、啟動和關閉所制作的VR內容,同時,也可用于基于真實物理空間下的本地多人協(xié)同空間定位和內容體驗。監(jiān)聽端主要用于監(jiān)聽和執(zhí)行客戶端啟動或關閉VR內容的指令,接收客戶端分發(fā)過來的配置文件和VR內容。Unity SDK主要用于Unity開發(fā)人員在Unity中導入插件調用相關接口進行虛擬現(xiàn)實沉浸式環(huán)境內容和大空間多人協(xié)同內容的創(chuàng)作和二次開發(fā)。
2.2? 環(huán)境與配置
采用LED三維立體屏構建主動立體沉浸式顯示系統(tǒng)。硬件配置LED三維成像立體屏、3D立體信號發(fā)射器、視頻處理器,啟動虛擬現(xiàn)實橋接軟件、虛擬現(xiàn)實渲染軟件和G-Motion光學位置追蹤系統(tǒng),使主動立體顯示系統(tǒng)激活,VR交互手柄和3D主動立體眼鏡處于動態(tài)跟蹤狀態(tài)。
系統(tǒng)工作站CPU為:Intel Xeon E-2176G 6C CPU 3.70 GHz處理器;芯片組為:英特爾C612高速芯片組;內存為:DDR4 2666 RDIMM ECC? 2×16 GB;顯卡為:NVIDIA Quadro P5000 16 GB配置;硬盤為:256 GB SSD+1 TB 3.5英寸 7200 rpm硬盤。
軟件運行Windows10,Microsoft DirectX,Microsoft .Net
Framework 4.5.2或以上版本,Microsoft Visual C++ 2013 Re-
distributable (x64),Microsoft Visual C++ 2015 Redistributable (x64),Unity2017.4.12。
2.3? LinkVR導入Unity工程
將LinkVR的.unitypackage文件導入ICU的Unity工程,構建LED三維主動立體沉浸式顯示場景。將LinkVR里的FPSController.prefab拖到場景中,在Hierarchy面板中選中FPSController物體下的LinkVRSystemRoot物體,修復不滿足LinkVR要求的相關項目設置。內容包括:
(1)將PlayerSettings中的顯示分辨率對話框選項設置為Disabled。
(2)將PlayerSettings中的捕獲單屏設置為false。
(3)將PlayerSettings中的MTRendering(多線程渲染)設置為false。
(4)將PlayerSettings中的VR支持打開,并將設備設置為Stereo Display(non head-mounted)。
(5)將QualitySettings中的抗鋸齒屬性設置為Disabled。
另外,由于LinkVR與Unity自帶的抗鋸齒功能存在沖突,故關閉Unity自帶的抗鋸齒功能。
2.4? 渲染模式選擇
LinkVR主動立體支持DirectX和OpenGL兩種渲染模式,由于OpenGL在系統(tǒng)方面的兼容性更好,本案例采用LinkVR Unity SDK默認并推薦的渲染方式OpenGLCore,將QualitySettings中的抗鋸齒屬性設置為不開啟,因Unity默認的抗鋸齒會破壞OpenGL渲染導致應用程序在打開后黑屏。
2.5? Post Processing抗鋸齒
Unity自帶的抗鋸齒功能關閉,故導致三維圖像品質大幅下降,為解決該問題,使用外部“Post Processing”插件取代Unity平臺抗鋸齒功能。將“Post Processing”導入工程,為FirstPersonCharacter添加“Post Processing Behaviour”腳本,新建文件“Post Processing profile”,選擇New Post-Processing Profile,勾選Antialiasing,Method選擇“FAA”或“TA”,并將New Post-Processing Profile拖拽至“Post Processing Behaviour”腳本的變量里。
2.6? 交互實施
LinkVR中,設有默認的手柄事件并開啟了手柄射線,腳本加載在LinkVR的Joystick.prefab上,當LinkVR系統(tǒng)初始化時,會默認加載該手柄。在虛擬現(xiàn)實沉浸式環(huán)境中,如需獲取來自手柄的輸入,實施三維定位和確發(fā)。首先,在LinkVR中,啟動StreamingAssets->VRPN->VenomxListener.exe,該程序會自動監(jiān)聽Venomx手柄的按鍵事件和搖桿軸事件。其次,LinkVR已設置“Clickable”和“Selectable”,分別為點擊和抓取的響應層級,故在綁定碰撞的前提下,還要為空間內需觸發(fā)的物體添加“Clickable”層,需拾取的物體添加“Selectable”層。并在觸發(fā)控制腳本內添加以下代碼,以便手柄通過LinkVR將觸發(fā)信息傳遞給應用程序:
using LinkVR;
void OnClick(){
BZ_open = Pass_open;
}
如果通過UI交互,需新建UI的Canvas,并選擇平面或立體模式,在Canvas下創(chuàng)建按鈕,在觸發(fā)控制代碼里加如下內容。
if (LinkVRInput.GetButtonDown(1))
{
BZ_move = 1;
}
3? 性能分析與優(yōu)化
當烘焙處理完成后,虛擬ICU已可以在PC模式下取得流暢的運行效果,可采用LinkVR構建的沉浸式場景運行起來卻出現(xiàn)強烈的滯后和頓挫感,需對程序性能做進一步的優(yōu)化和提升。
3.1? 性能分析
通過Stats、Profiler和嵌入子程序的方式,對工程播放和發(fā)布后程序運行兩種狀態(tài)下的FPS進行采樣和分析:
(1)采用Stats、Profiler對導入LinkVR后的Unity工程進行分析,Stats為32.9%,Gfx.WaitForPresent為59.1%,且GPU耗時大于CPU耗時,確認場景是GPC密集,顯示場景渲染消耗大量資源。為獲得發(fā)布后程序運行狀態(tài)下的FPS,通過下列腳本采集場景實際運行中的FPS:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fpsshow :MonoBehaviour{
float deltaTime = 0.0f;
void Update() {
deltaTime += (Time.unscaledDeltaTime - deltaTime) * 0.1f;
}
void OnGUI()? {
int w = Screen.width,h = Screen.height;
GUIStyle style = new GUIStyle();
Rect rect = new Rect(0,0,w,h * 2 / 100);
style.alignment = TextAnchor.UpperLeft;
style.fontSize = h * 2 / 100;
//new Color (0.0f,0.0f,0.5f,1.0f);
style.normal.textColor = Color.white;
float msec = deltaTime * 1000.0f;
float fps = 1.0f / deltaTime;
string text = string.Format("{0:0.0} ms ({1:0.} fps)",msec,fps);
GUI.Label(rect,text,style);
}
}
如圖3所示,ICU的視野比較通透,所有病房均設置前后兩道門,普通病房(1~4號)前門面向護士站,采取雙開設計,方便病床移位,器官移植病房(5、6號)側向面對,所有病房門都使用透明玻璃,方便查看和監(jiān)護,故而導致場景整體顯示內容多,計算資源消耗大。為方便比對和分析,選擇如圖所示A、B、C、D四個視角作為采樣點,并在工程播放和程序發(fā)布后兩種運行狀態(tài)進行FPS數(shù)據(jù)采樣,如表1所示。
(2)由于開發(fā)平臺消耗資源,故工程播放狀態(tài)的FPS明顯低于程序發(fā)布后運行的FPS。各個視角的場景復雜程度不同,F(xiàn)PS也明顯不同,其中,A視角FPS最小,顯示內容包括護士站、大廳和2~6號病房,該視角顯示內容最多,最能反映ICU全貌,渲染壓力也最大;B視角FPS次之,顯示內容包括大廳、1~5號病房和護士站部分內容,顯示內容僅次于A視角,C視角和D視角的FPS較大,顯示內容主要為病房內的吊橋、病床、相關設施,渲染壓力明顯小于A視角和B視角??偟膩碚f,虛擬ICU場景區(qū)域繁多、設施品種復雜、視覺通透,渲染內容多,且在場景各區(qū)域FPS存在不均衡的狀況。
3.2? 性能優(yōu)化
根據(jù)ICU布局同、特點和FPS的分布狀況,在充分發(fā)揮視錐剔除的基礎上,從調整場景布局、合理分離大模型、設置遮擋剔除和設置LOD等方面對性能進行優(yōu)化:
(1)調整場景布局,對各區(qū)域和FPS進行均衡和優(yōu)化。護士、病人和被鋪是場景內面數(shù)最多的復雜模型,將這些內容的安放位置調整至FPS較高的1號、5號病房,降低A視角的渲染壓力,1號病房在A視角的視錐外,5號病房門背向A視角,遮擋剔除作用顯著,這樣可使4個視角的FPS趨于均衡。
(2)合理分離大模型,提升視錐剔除功效。原模型結構集成合并度過高,如6個病房的墻體為一個完整模型、大廳內外墻、過道等建筑模型均為一個整體,而在Unity里,只有當模型完全在視錐外時剔除才能有效,這就導致A、B兩個視角外的許多物體也被渲染,視錐剔除效率降低。某些透過病房門可看到探視通道的視角(即便只是看到一個點),探視通道內的所有圖片都將渲染,浪費大量GPU資源。故而,對場景內過大的模型進行適當分離,如以病房為單位對病房的墻體拆離、大廳墻體按E、S、W、N方向拆解,探視通道內的圖片分離,這樣,當A視角順時針轉動時,E側墻體和1、2、3號病房墻體依次被剔除,探視通道內S側墻體上的圖片也依次消失,大幅降低A視角的渲染壓力,提升該視角的動態(tài)FPS。
(3)設置遮擋剔除,減少視錐內被渲染內容。將場景內尺寸較大的模型設置為“Occluder Static(遮擋)”和“Occludee Static(被遮擋)”,尺寸較小的模型設置為Occludee Static”,“Smallest Hole”設為1.2,“Backface”設為0.2,baked后生成的網(wǎng)格大小與病房相近。在A視角,2、4、5、6號病房的洗手池、掛鐘(E側)和呼吸機、吸痰機(S側)等設施被遮擋;在B視角1~4號病房的吊橋、病床(W側)和呼吸機、吸痰機(S側)等設施被遮擋;在病房內的C、D視角,除房內設施和大廳的部分視線內的物體外,其他模型均被剔除。
(4)設置LOD,LOD按照模型的位置和重要程度決定物體渲染的資源分配,降低非重要物體的面數(shù)和細節(jié)度,從而獲得高效率的渲染運算。選擇場景內最復雜的人物、被鋪、病床和吊橋等模型,建立精度較低的中模和低模,分別添加到LOD Group組件里的LOD0、LOD1和LOD2上,通過Edit-Project Settings-Quality-Other設置“Lod Bias”參數(shù)值,以獲取最佳的變化效果,如圖4所示。
4? 結? 論
采取烘焙、遮擋剔除和LOD等技術手段優(yōu)化后,虛擬場景運行流暢度和穩(wěn)定性顯著提升。在對應的4個采樣視角獲得的FPS均得到改善,其中A視角FPS由50提升至68,B視角FPS由81提升至97,這兩視角的性能提升較為明顯,C、D兩角度FPS數(shù)據(jù)基本持平,原因是為均衡場景各區(qū)域和各視角的FPS,將原安放于3、6號病房消耗資源較多的人物和被鋪等模型調整至1、5號病房所致。
盡管虛擬場景性能獲得提升,但在實際運行中,由于沉浸式場景對FPS指標有更高的要求,渲染壓力最大的A視角仍然存在少許卡頓,旋轉操作更為明顯。為提升感官舒適度,在幾個重要的查看點設置瞬移跳轉,在提升感官舒適度的同時,提高移動效率,降低GPU資源消耗。沉浸式場景營造的感官體驗使人震撼,但使用過程中所帶來的暈眩感卻一直存在,未來,無論在基礎層面上的硬件和算法,還是在應用層面上的措施和手段都有待進一步的研究和提升。
參考文獻:
[1] 駱巖紅,鄧克巖,田歌,等.沉浸式VR教學系統(tǒng)“未奧” [J].計算機仿真,2020,37(11):194-198+303.
[2] 周向戈,唐麗玉,彭先敏,等.三維園林植被景觀構建與虛擬展示 [J].計算機工程與應用,2019,55(7):234-240.
[3] 楊晨彬,高瞻.基于WebVR的醫(yī)學體數(shù)據(jù)可視化 [J].計算機應用與軟件,2019,36(5):101-107.
[4] 高曉晶,馮麗露.360°全景漫游在校園虛擬展示設計中的應用研究 [J].中國教育信息化,2018(6):85-88.
[5] 李婷婷,王相海.基于AR-VR混合技術的博物館展覽互動應用研究 [J].計算機工程與應用,2017,53(22):185-189+263.
作者簡介:項朝陽(1965.04—),漢族,廣東廣州人,教授,高工,碩士,曾獲國家級教學成果二等獎、廣東省教學成果一等獎,研究方向:虛擬現(xiàn)實。