馬瑞 (安徽電子信息職業技術學院軟件學院,安徽 蚌埠233030)
三維虛擬技術的應用將會越來越廣泛,其中采用Unity3D技術開發的三維虛擬系統具有模型可視化、虛擬與現實交互、實時更新虛擬模型和支持多平臺等優點,是目前眾多三維虛擬設計軟件中開源代碼及功能應用全面的三維虛擬引擎[1-2]。通常情況下,虛擬系統在Web服務器端發布,設計人員將系統中所有資源存放在Web服務器供用戶使用。用戶在使用系統時將所需要的系統資源文件全部下載完畢后,軟件才能動態的加載并創建系統里的場景和角色等對象,然后才能動態的將腳本綁定在虛擬數字對象上,動態地將貼圖賦予虛擬數字對象,必須動態地完成各種加載操作之后系統才能有效的運行,這樣會大大影響用戶從系統服務器中得到響應的時間以及在用戶端系統動態運行的效率。為此,筆者利用Unity3D提供的Prefab和Assetbundle功能對系統里的模型資源、UI資源進行預置、封包和解包,當從服務器上將先預置后封包的Assetbundle文件下載后直接實例化,再放入到三維虛擬數字校園系統中,這樣可以有效提高系統在Web用戶端的運行效率。
預置是Unity3D中提供給設計人員的一種資源類型,其是存儲在項目視圖中的一種可重復使用的三維模型資源對象[3]。預置可以重復多次地載入到多個不同場景中,當場景中載入了一個預置對象,系統就會自動創建對應的實例,且所有預置實例都鏈接到原始預置本身,也就是說預置實例都是預置本身的克隆。不管項目存在多少實例,當對預置進行任何更改,將會看到這些更改都會被應用到該預置對象的所有實例中。一般情況下,預置封包時占用很少的存儲空間(不超過1KB)。在實際開發過程中,預置對象會關聯模型、特效、界面、聲音、場景和腳本等資源,關聯上述資源后,預置對象的存儲就會隨著變大,因而在系統設計過程中應盡量減少預置對象的重復關聯,由此減少系統消耗的內存資源[4]。
一般情況下,設計人員會把腳本文件綁定到預置對象上,然后再進行資源封包,但是移動平臺不支持腳本更新,如將JumpTest.js這條測試腳本綁定在預置中,系統移動平臺通過服務器下載該封包,再載入到工程中會發生JumpTest.js測試腳本不能被正常加載和執行的現象[5]。在實際系統中,存在需要大量的動態加載和執行腳本文件的需求,為了滿足上述需要,可以在腳本中添加Public變量,通過Inspector腳本中的Public參數實現腳本更新。如果本地包含JumpTest.js腳本,系統將把該腳本綁定在從服務器端下載的預置中并且被執行,但是當本地工程文件中沒有JumpTest.js腳本文件時,那么從服務器端下載的預置中的腳本文件將永遠不被執行。因此,應通過在腳本文件中添加Public變量,以及對Public變量參數的修改來實現移動平臺的腳本更新。
場景需要保存模型及該模型文件的相關文件和坐標信息,并且烘培該場景的光信。由于烘培不能被重新加載,因此只能烘焙場景特有模型,被多場景共用的模型必須動態加載。由于場景中存在很多公用模型,因而如何設計封裝規則封包場景資源就顯得尤為重要[6]。封包場景資源占用內存的大小=公用模型的大小×場景的個數的大小,這表明場景資源封包會重復占用大量的內存資源。通過研究場景封包的策略,首先烘培整個場景,然后丟掉其中的公共模型,只保留特有的模型。采用XML文件記錄被丟掉的公共模型在場景中的坐標數據,最后將其封包在不同的封包文件中(見圖1)。
由于系統中公共資源的封包被加載的次數更多,因此該封包被設計成在內存中常駐。系統場景封包的執行過程設計為,首先系統下載場景的封包,然后依據場景封包文件中的XML文檔的坐標信息,從內存中調用常駐的公共資源封包動態地再加載到場景中,最終實現整個場景的加載。

圖1 公共資源與多場景封包架構圖
通常情況下,系統封包都是由設計人員根據系統規劃,人工判斷每個場景中哪些是其特有資源,哪些是和其他場景共用資源,上述處理方式效率低且容易出錯。為此,設計一種自動封包方法,設計程序對所有場景進行遍歷,記錄資源的被使用信息,判斷哪些資源被場景封包,哪些資源獨立封包,最終完成系統資源的封包工作。
由于Assetbundle封包可以同時放在服務器或者本地,并且下載讀取的方式完全一樣,因而設計人員可以在系統開發階段把資源封包建設在本地,當系統完成前期測試后再把資源封包上傳到服務器上進行公共測試,這樣有利于系統在公共測試和發布后的不斷更新[7]。
讀取封包(WWW bundle=new WWW(path);WWW.LoadFromCacheOrDownload(path,5))分為2種方式:方式1是bundle只能保存在內存中,一旦退出系統再進入還得重新下載,因而該方式不適用;方式2是將Unity3D下載Assetbundle到本地中,其原理是通過版本號和下載地址在本地尋找是否有該Assetbundle,如果有則直接返回對象,如果沒有則根據下載地址重新從服務器或者本地下載。
利用專業Unity3D性能測試工具Profiler測試系統,得到未采用封包策略的系統運行內存測試數據如圖2所示,而采用封包策略后的系統運行內存測試數據如圖3所示。比較圖2和圖3可知,未來用封包策略占用的內存資源數據為0.52GB,而采用封包策略占用的內存資源數據為386.5MB,表明采用封包策略后系統占內存空間明顯減少,因而系統在客戶端的運行效率更高。
采用Unity3D提供的Prafab及Assetbundle對三維虛擬數字校園系統的模型文件進行預置和封包,并采用公共模型Assetbundle單獨封包,這樣可以有效減少常駐內存的模型文件數量,從而起到提高系統運行及數據再次加載的效率。今后,對基于Unity3D的三維虛擬數字校園系統來說,如何提高客戶端的下載速度、場景在客戶端加載的效率及系統在客戶端運行的效率和穩定性,需要進一步加以研究并使之完善。

圖2 未采用封包策略的內存測試數據圖

圖3 采用封包策略的內存測試數據圖
[1] 王星捷,李春花 .基于Unity3D平臺的三維虛擬城市研究與應用 [J].計算機技術與發展,2013(4):241-244.
[2] 李保杰,于法展,李戰成 .基于OpenGL虛擬校園漫游系統的設計與實現 [J].蘇州科技學院學報,2006,22(19):45-48.
[3] 朱慧娟 .基于Unity3D的虛擬漫游系統 [J].計算機系統應用,2012,21(10):36-39,65.
[4] 宣雨松.Unity3D游戲開發 [M].北京:人民郵電出版社,2012.
[5] 鄒靜 .迎接互聯網的明天——玩轉3Dweb[M].北京:電子工業出版社,2011.
[6] Ramasundaram V,Grunwald S,Mangeot A,et al.Development of an environmental virtual field laboratory [J].Computers &Education,2005,45(1):21-34.
[7] Mac E,Cai G,Sharma R.Enabling collaborative geoinformation access and decision-making through a natura,multimodal interface [J].International Journal of Geographical Information Science,2005,19(3):267-292.