馬瑞 (安徽電子信息職業(yè)技術(shù)學院軟件學院,安徽 蚌埠233030)
三維虛擬技術(shù)的應用將會越來越廣泛,其中采用Unity3D技術(shù)開發(fā)的三維虛擬系統(tǒng)具有模型可視化、虛擬與現(xiàn)實交互、實時更新虛擬模型和支持多平臺等優(yōu)點,是目前眾多三維虛擬設(shè)計軟件中開源代碼及功能應用全面的三維虛擬引擎[1-2]。通常情況下,虛擬系統(tǒng)在Web服務器端發(fā)布,設(shè)計人員將系統(tǒng)中所有資源存放在Web服務器供用戶使用。用戶在使用系統(tǒng)時將所需要的系統(tǒng)資源文件全部下載完畢后,軟件才能動態(tài)的加載并創(chuàng)建系統(tǒng)里的場景和角色等對象,然后才能動態(tài)的將腳本綁定在虛擬數(shù)字對象上,動態(tài)地將貼圖賦予虛擬數(shù)字對象,必須動態(tài)地完成各種加載操作之后系統(tǒng)才能有效的運行,這樣會大大影響用戶從系統(tǒng)服務器中得到響應的時間以及在用戶端系統(tǒng)動態(tài)運行的效率。為此,筆者利用Unity3D提供的Prefab和Assetbundle功能對系統(tǒng)里的模型資源、UI資源進行預置、封包和解包,當從服務器上將先預置后封包的Assetbundle文件下載后直接實例化,再放入到三維虛擬數(shù)字校園系統(tǒng)中,這樣可以有效提高系統(tǒng)在Web用戶端的運行效率。
預置是Unity3D中提供給設(shè)計人員的一種資源類型,其是存儲在項目視圖中的一種可重復使用的三維模型資源對象[3]。預置可以重復多次地載入到多個不同場景中,當場景中載入了一個預置對象,系統(tǒng)就會自動創(chuàng)建對應的實例,且所有預置實例都鏈接到原始預置本身,也就是說預置實例都是預置本身的克隆。不管項目存在多少實例,當對預置進行任何更改,將會看到這些更改都會被應用到該預置對象的所有實例中。一般情況下,預置封包時占用很少的存儲空間(不超過1KB)。在實際開發(fā)過程中,預置對象會關(guān)聯(lián)模型、特效、界面、聲音、場景和腳本等資源,關(guān)聯(lián)上述資源后,預置對象的存儲就會隨著變大,因而在系統(tǒng)設(shè)計過程中應盡量減少預置對象的重復關(guān)聯(lián),由此減少系統(tǒng)消耗的內(nèi)存資源[4]。
一般情況下,設(shè)計人員會把腳本文件綁定到預置對象上,然后再進行資源封包,但是移動平臺不支持腳本更新,如將JumpTest.js這條測試腳本綁定在預置中,系統(tǒng)移動平臺通過服務器下載該封包,再載入到工程中會發(fā)生JumpTest.js測試腳本不能被正常加載和執(zhí)行的現(xiàn)象[5]。在實際系統(tǒng)中,存在需要大量的動態(tài)加載和執(zhí)行腳本文件的需求,為了滿足上述需要,可以在腳本中添加Public變量,通過Inspector腳本中的Public參數(shù)實現(xiàn)腳本更新。如果本地包含JumpTest.js腳本,系統(tǒng)將把該腳本綁定在從服務器端下載的預置中并且被執(zhí)行,但是當本地工程文件中沒有JumpTest.js腳本文件時,那么從服務器端下載的預置中的腳本文件將永遠不被執(zhí)行。因此,應通過在腳本文件中添加Public變量,以及對Public變量參數(shù)的修改來實現(xiàn)移動平臺的腳本更新。
場景需要保存模型及該模型文件的相關(guān)文件和坐標信息,并且烘培該場景的光信。由于烘培不能被重新加載,因此只能烘焙場景特有模型,被多場景共用的模型必須動態(tài)加載。由于場景中存在很多公用模型,因而如何設(shè)計封裝規(guī)則封包場景資源就顯得尤為重要[6]。封包場景資源占用內(nèi)存的大?。焦媚P偷拇笮 翀鼍暗膫€數(shù)的大小,這表明場景資源封包會重復占用大量的內(nèi)存資源。通過研究場景封包的策略,首先烘培整個場景,然后丟掉其中的公共模型,只保留特有的模型。采用XML文件記錄被丟掉的公共模型在場景中的坐標數(shù)據(jù),最后將其封包在不同的封包文件中(見圖1)。
由于系統(tǒng)中公共資源的封包被加載的次數(shù)更多,因此該封包被設(shè)計成在內(nèi)存中常駐。系統(tǒng)場景封包的執(zhí)行過程設(shè)計為,首先系統(tǒng)下載場景的封包,然后依據(jù)場景封包文件中的XML文檔的坐標信息,從內(nèi)存中調(diào)用常駐的公共資源封包動態(tài)地再加載到場景中,最終實現(xiàn)整個場景的加載。
圖1 公共資源與多場景封包架構(gòu)圖
通常情況下,系統(tǒng)封包都是由設(shè)計人員根據(jù)系統(tǒng)規(guī)劃,人工判斷每個場景中哪些是其特有資源,哪些是和其他場景共用資源,上述處理方式效率低且容易出錯。為此,設(shè)計一種自動封包方法,設(shè)計程序?qū)λ袌鼍斑M行遍歷,記錄資源的被使用信息,判斷哪些資源被場景封包,哪些資源獨立封包,最終完成系統(tǒng)資源的封包工作。
由于Assetbundle封包可以同時放在服務器或者本地,并且下載讀取的方式完全一樣,因而設(shè)計人員可以在系統(tǒng)開發(fā)階段把資源封包建設(shè)在本地,當系統(tǒng)完成前期測試后再把資源封包上傳到服務器上進行公共測試,這樣有利于系統(tǒng)在公共測試和發(fā)布后的不斷更新[7]。
讀取封包(WWW bundle=new WWW(path);WWW.LoadFromCacheOrDownload(path,5))分為2種方式:方式1是bundle只能保存在內(nèi)存中,一旦退出系統(tǒng)再進入還得重新下載,因而該方式不適用;方式2是將Unity3D下載Assetbundle到本地中,其原理是通過版本號和下載地址在本地尋找是否有該Assetbundle,如果有則直接返回對象,如果沒有則根據(jù)下載地址重新從服務器或者本地下載。
利用專業(yè)Unity3D性能測試工具Profiler測試系統(tǒng),得到未采用封包策略的系統(tǒng)運行內(nèi)存測試數(shù)據(jù)如圖2所示,而采用封包策略后的系統(tǒng)運行內(nèi)存測試數(shù)據(jù)如圖3所示。比較圖2和圖3可知,未來用封包策略占用的內(nèi)存資源數(shù)據(jù)為0.52GB,而采用封包策略占用的內(nèi)存資源數(shù)據(jù)為386.5MB,表明采用封包策略后系統(tǒng)占內(nèi)存空間明顯減少,因而系統(tǒng)在客戶端的運行效率更高。
采用Unity3D提供的Prafab及Assetbundle對三維虛擬數(shù)字校園系統(tǒng)的模型文件進行預置和封包,并采用公共模型Assetbundle單獨封包,這樣可以有效減少常駐內(nèi)存的模型文件數(shù)量,從而起到提高系統(tǒng)運行及數(shù)據(jù)再次加載的效率。今后,對基于Unity3D的三維虛擬數(shù)字校園系統(tǒng)來說,如何提高客戶端的下載速度、場景在客戶端加載的效率及系統(tǒng)在客戶端運行的效率和穩(wěn)定性,需要進一步加以研究并使之完善。
圖2 未采用封包策略的內(nèi)存測試數(shù)據(jù)圖
圖3 采用封包策略的內(nèi)存測試數(shù)據(jù)圖
[1] 王星捷,李春花 .基于Unity3D平臺的三維虛擬城市研究與應用 [J].計算機技術(shù)與發(fā)展,2013(4):241-244.
[2] 李保杰,于法展,李戰(zhàn)成 .基于OpenGL虛擬校園漫游系統(tǒng)的設(shè)計與實現(xiàn) [J].蘇州科技學院學報,2006,22(19):45-48.
[3] 朱慧娟 .基于Unity3D的虛擬漫游系統(tǒng) [J].計算機系統(tǒng)應用,2012,21(10):36-39,65.
[4] 宣雨松.Unity3D游戲開發(fā) [M].北京:人民郵電出版社,2012.
[5] 鄒靜 .迎接互聯(lián)網(wǎng)的明天——玩轉(zhuǎn)3Dweb[M].北京:電子工業(yè)出版社,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.