耿 肖 韓志偉 廖 峰
(西南交通大學電氣工程學院 成都 610031)
?
基于Unity引擎的地形塊動態(tài)調(diào)度算法研究*
耿肖韓志偉廖峰
(西南交通大學電氣工程學院成都610031)
針對基于Unity引擎的三維場景仿真中大地形加載過程中內(nèi)存占用量大的問題,從模型資源加載角度設計一種地形塊動態(tài)調(diào)度算法。以視點位置在地形平面投影為中心,加載其周邊地形塊,在視點移動過程中,根據(jù)其在地形平面投影映射的地形塊行、列值變化,更新當前視點周邊地形塊隊列,并計算需加載區(qū)域和需卸載區(qū)域,進而實現(xiàn)地形塊的動態(tài)加載和卸載。最后依托Unity的內(nèi)存管理機制,設計具體程序并實現(xiàn)地形塊動態(tài)調(diào)度和內(nèi)存優(yōu)化。實驗結(jié)果表明:該方法與直接進行大地形加載相比,能明顯減少三維仿真中地形資源的內(nèi)存占用量,并且大幅度提升幀率,在三維場景仿真中應用效果良好。
地形塊; 動態(tài)調(diào)度; 視點位置; 內(nèi)存管理; 三維仿真
Class NumberTP391
三維地形仿真一直是虛擬現(xiàn)實、三維游戲、虛擬仿真等領域的研究熱點,它直接影響整個系統(tǒng)的真實感和沉浸感。為了提高地形漫游的實時性和計算機的渲染效率,國內(nèi)外學者不斷地改進相關技術。目前,主要從兩個方面解決大規(guī)模地形渲染問題[1~2]。一是通過數(shù)據(jù)簡化減少繪制的三角面數(shù)量:具有代表性的有四叉樹算法、ROAM算法。二是通過對地形進行分塊設計合理的組織體系,減少一次性載入量。文獻[3]通過數(shù)據(jù)庫動態(tài)存儲分塊數(shù)據(jù)并選擇合適分塊大小,采用動態(tài)LOD加快地形生成速度;文獻[4]采用分頁方法對地形進行管理。很多學者將二者結(jié)合來提高地形渲染效率,文獻[5]提出一種基于線性四叉樹的分塊層次細節(jié)實時渲染算法,通過降采樣減少高程數(shù)據(jù)存儲量,并定義調(diào)度準則,最后有效地降低了CPU處理時間和GPU渲染批次。文獻[6]通過構(gòu)建多分辨率地形塊,根據(jù)視點位置在地形平面投影進行塊調(diào)度,根據(jù)視點高度更改塊層次。文獻[7]也是將地形分塊,根據(jù)視錐在地形平面的投影判斷地形可見范圍,同時采用一種基于視點運動的外推算法,對視點位置和方向進行預測,提前預加載進入視錐的地形數(shù)據(jù),從而有效減少渲染速率變化。
上述方法大多從DEM(Digital Elevation Model)數(shù)據(jù)入手實現(xiàn)地形的可視化,數(shù)據(jù)量大,實現(xiàn)過程較為復雜而且不利于地形編輯。游戲引擎的出現(xiàn)使得三維仿真中地形的構(gòu)建更加便捷。故本文針對Unity引擎中構(gòu)建地形塊簡單、快捷的優(yōu)勢,結(jié)合其內(nèi)存管理機制,從模型資源載入的角度,設計了一種地形塊的動態(tài)調(diào)度算法。該算法將地形資源分塊以行、列值進行標記,通過視點在地形平面的投影確定當前地形塊行、列值,計算當前需加載地形塊列表。在攝像機移動過程中,計算地形塊列表更新,動態(tài)加載需調(diào)入的地形塊,并卸載需調(diào)出的地形塊。最后通過實驗對比其與一次性加載時計算機內(nèi)存占用、載入時間等數(shù)據(jù)情況,驗證了該算法的高效性。
Unity引擎是由Unity Technologies公司開發(fā)的跨平臺的專業(yè)游戲引擎,其廣泛的平臺支持和豐富的插件支持使其在游戲開發(fā)、虛擬現(xiàn)實、培訓仿真等領域具有廣泛應用[8]。
2.1Unity地形構(gòu)建方法
目前獲取真實地形的主要方法有兩種[9]:一是從數(shù)字高程讀取,該方法數(shù)據(jù)量大,適合復雜地形研究。二是從衛(wèi)星圖提取,該方法操作容易、速度較快,但精度要求較低。在虛擬三維場景仿真中,地形作為輔助對象存在,需占用較少資源,故本文采取第二種方式。
Unity中構(gòu)建地形的方式有多種,可直接通過自帶地形工具繪制或建模軟件獲取,也可通過插件利用衛(wèi)星地圖獲取。本文利用Terrain Composer插件工具獲取衛(wèi)星地圖中指定區(qū)域的地形數(shù)據(jù)和紋理特征,并且切割地形塊,導入Unity能夠直接生成地形塊資源和地形紋理資源。此外Unity地形組件支持LOD(Levels of Detail),從而大大減少了從DEM數(shù)據(jù)構(gòu)建LOD和劃分地形塊的工作量,構(gòu)建地形便捷、高效。其獲取地形分塊的網(wǎng)格模型如圖1所示。
圖1 Terrain Composer獲取真實地形的網(wǎng)格模型
2.2Unity資源管理方式
在Unity引擎中資源文件和場景文件是不同的,資源文件作為程序依賴項主要存放于硬盤中,場景文件則在當前程序運行時被加載至內(nèi)存。預設(prefab)是聯(lián)系二者的重要概念,它是游戲?qū)ο蠹捌浣M件的集合,具有繼承、重載等屬性,極大地方便了資源的重復利用。預設作為一種資源集合引用,可以通過在場景中創(chuàng)建或者銷毀預設來實現(xiàn)對資源的動態(tài)管理。而地形作為資源文件的一種,可以通過預設進行管理,在場景需要時加載指定地形塊至場景,同時卸載不必要的地形塊。在Unity引擎中,創(chuàng)建和銷毀資源的方式有多種,方式不同,其對內(nèi)存的占用的影響也不同,3.2節(jié)中將詳細分析Unity內(nèi)存管理機制并從內(nèi)存管理層面確定本文地形塊動態(tài)調(diào)度具體實現(xiàn)方法。
在三維場景仿真中,地形作為仿真背景能夠極大地提高場景的真實度,但是存在于地形之上的被仿真對象(例如變電站培訓仿真中的變電站)才是仿真重點,因此地形在程序中占用的計算機資源應該盡量小。本文針對Unity中構(gòu)建地形的快捷性,采用基于視點(攝像機)位置的地形塊調(diào)度策略[10],以視點位置為中心,動態(tài)調(diào)度攝像機周邊地形塊,從而實現(xiàn)場景漫游中地形資源的優(yōu)化。
3.1基于視點位置的地形塊更新
通過Terrain Composer工具構(gòu)建地形時已經(jīng)對大地形進行地形分割,而且具備自動LOD,所以可以對地形塊進行、行列值標記區(qū)分。而Unity加載資源時以資源名稱作為索引值,因此可以用二維數(shù)組保存地形塊名稱,然后通過視點位置在X、Z平面(即地形平面)的投影判斷當前地形塊范圍,進行地形塊的動態(tài)調(diào)度。以圖2為例,其中(2,2)地形塊為攝像機初始所在位置,其周邊8塊地形塊(圖中淺色區(qū)域)在初始化時均加載至內(nèi)存,在漫游過程中,加載攝像機移動方向前方的地形塊,卸載超出攝像機周邊范圍的地形塊。若攝像機向右移動進入地形塊(3,2)則加載即將進入視野的(4,1)、(4,2)、(4,3)地形塊,卸載遠離攝像機運動方向的(1,1)、(1,2)、(1,3)地形塊。在此過程中加載至場景中的地形塊數(shù)量始終保持不變,從而維持計算機內(nèi)存占用的平穩(wěn)。
圖2 視點位置在地形平面坐標系映射關系
攝影機在地形平面中投影位置的計算方法隨地形塊在世界坐標系中位置不同而不同。若以地形中心為世界坐標系中心,則圖2中的攝像機位置映射關系可用式(1)表示。
(1)
其中CamNum_X為攝像機映射至地形平面所在地形塊行值;CamPos.x為攝像機在世界坐標系中X軸分量;TerrainSize為地形塊大小;N為地形塊數(shù)組維度。攝像機在地形平面的Z方向映射計算方法與之類似。
通過視點位置的映射,易知當前視點所在地形塊行、列值及其周邊地形塊,進而可以通過地形數(shù)組中地形塊名稱來動態(tài)加載或卸載地形資源,實現(xiàn)動態(tài)調(diào)度。
3.2動態(tài)調(diào)度下內(nèi)存管理
在Unity中,將資源文件加載至場景中顯示物體對象(含網(wǎng)格、貼圖、材質(zhì)等信息)有多種方式,不同的調(diào)用方式在內(nèi)存的占用過程也不一致。Unity中內(nèi)存管理機制如圖3所示[11~12]。
其中加載預設的方式有三種[13],一是靜態(tài)引用,聲明公有變量,然后在Inspector窗口中給變量賦值,之后實例化(Instantiate);二是采用Resources.Load(),Load之后進行實例化;三是采用AssetBundle.Load(),然后進行實例化。其中前兩種加載方式在Load過程中只加載網(wǎng)格(Mesh)信息,在實例化過程中才會加載材質(zhì)(Material)和貼圖(Texture),而第三種加載方式在Load過程中就會直接加載預設全部依賴資源,在實例化過程中只是進行克隆操作。
圖3 Unity動態(tài)加載過程內(nèi)存管理機制
由圖3可以看出在資源的銷毀過程中,Destory()函數(shù)只是銷毀實例化過程中對資源的引用或復制,并沒有釋放已加載至內(nèi)存的紋理、材質(zhì)等資源,所以其釋放資源有限。UnloadAsset(obj)釋放區(qū)域中指定的資源。UnloadUnusedAssets()會卸載當前所有沒有被占用的資源。
通過上述分析可知在漫游時采用AssetBundle()加載方式能同時加載預設的紋理、材質(zhì)信息,此方法能夠避免卡幀現(xiàn)象。卸載時使用Destory()函數(shù)銷毀物體對象后,在地形塊卸載完成后調(diào)用UnloadUnusedAssets()函數(shù)將未被占用的紋理、貼圖資源徹底卸載以實現(xiàn)內(nèi)存回收。至此,在場景漫游中,地形資源的計算機占用率始終維持在較低水平。
3.3地形塊動態(tài)調(diào)度算法實現(xiàn)
針對上述內(nèi)存管理機制,設計了如圖4所示的地形塊動態(tài)調(diào)度算法。該算法以攝像機位置為中心,通過對地形資源進行預設實例化和預設銷毀完成內(nèi)存管理。其具體算法過程如下:
Step1.程序初始化時根據(jù)攝像機初始位置加載其周圍九個地形塊,并將載入地形塊名稱存入當前地形塊列表CurrentTerrainList(保存當前已加載地形塊名稱)。
Step2.程序進入幀更新,獲取當前攝像機位置計算其映射地形塊,若未發(fā)生變化則不處理,否則進入地形塊動態(tài)調(diào)度。
Step3.根據(jù)變化后的攝像機所映射的地形塊行、列值,計算當前攝像機周邊地形塊名稱,將其存入字符串列表RefreshTerrainList(保存幀更新后地形塊名稱)。
圖4 地形塊動態(tài)調(diào)度算法流程
Step4.由幀更新前后的地形塊列表差值計算需要加載和卸載的地形塊。
Step5.采用AssetBundle.Load()方法加載新的地形塊;采用Destory()函數(shù)銷毀場景對象,并在完成后調(diào)用UnloadUnusedAssets()回收內(nèi)存。
Step6.完成調(diào)度后,將RefreshTerrainList賦值給CurrentTerrainList,即更新當前地形塊列表。
Step7.程序是否結(jié)束,若結(jié)束則退出程序,否則進入下一幀循環(huán)。
其中,結(jié)合圖2知,列表RefreshTerrainList與CurrentTerrainList的差集則代表需要加載的新的地形塊,而CurrentTerrainList與RefreshTerrainList的差集則代表需要卸載的地形塊。完成地形塊的動態(tài)加載和卸載之后,執(zhí)行UnloadUnusedAssets()函數(shù)釋放地形塊的紋理、材質(zhì)等內(nèi)存資源,并更新當前地形塊列表,由此則完成整個地形塊的調(diào)度過程,程序進入下一幀循環(huán)。在整個幀循環(huán)過程中,內(nèi)存中地形塊的數(shù)量維持不變,從而實現(xiàn)對內(nèi)存中地形塊內(nèi)存占用的管理。
4.1地形塊動態(tài)調(diào)度實例驗證
本文以81(9*9)塊940*940大小的地形塊進行驗證(如圖5(a)所示,其中地形塊周圍數(shù)字為其行列值)。切割完成后地形塊共包含jpg格式紋理貼圖81張,地形模型81個。若以地形中心為世界坐標系中心,初始時攝像機的x、z坐標為0,則初始化時加載的地形塊為(4,4)及其周邊八塊地形,在攝像機移動的過程中,地形塊始終隨著攝像機移動而動態(tài)加載和卸載,實時進行地形塊動態(tài)調(diào)度,以保證攝像機所在地形塊始終處于中心位置。圖5(b)為動態(tài)調(diào)度過程中攝像機水平向右移動過程中當前地形塊變化過程,攝像機由地形塊(4,4)進入地形塊(4,5),內(nèi)存中地形塊完成動態(tài)調(diào)度。圖5(c)為電力桿塔巡視場景,其中計算機配置為Core i3 CPU,主頻2.27GHz,2G內(nèi)存,ATI 5400 512M顯卡,Unity版本為5.0。在場景漫游中,幀率達到60幀/秒,地形調(diào)度過程流暢。
圖5 地形塊動態(tài)調(diào)度算法實例
4.2地形塊動態(tài)調(diào)度過程中的性能分析
針對上述實驗,本文在程序內(nèi)存占用、幀率等方面進行實測數(shù)據(jù)分析,以量化該動態(tài)調(diào)度算法對計算機性能的影響。采用一次性加載方式與采用動態(tài)調(diào)度算法加載地形方式的主要計算機性能指標如表1所示(計算機配置同4.1)。
表1 兩種加載方式主要性能指標對比
由上表可見,本實驗中采用動態(tài)調(diào)度之后,程序中的紋理內(nèi)存占用、網(wǎng)格內(nèi)存占用以及總內(nèi)存占用均大大降低,而且?guī)侍嵘槐?。由性能分析器的?nèi)存占用曲線(圖6所示)可以看出,在進行動態(tài)調(diào)度時,地形塊的加載和卸載過程占用時間很短,而且內(nèi)存始終維持在穩(wěn)定水平。隨著地形面積的增大,該算法的優(yōu)勢將更加明顯。
圖6 地形塊動態(tài)調(diào)度過程中內(nèi)存占用過程
三維引擎的出現(xiàn)極大地方便了游戲開發(fā)和虛擬仿真開發(fā)人員,而Unity憑借其強大的功能特性、跨平臺支持和可視化開發(fā)環(huán)境等優(yōu)勢在三維引擎中迅速占據(jù)一席之地。本文針對Unity引擎中大場景漫游地形一次性加載內(nèi)存占用量大的問題,詳細分析了其內(nèi)存管理機制,從模型資源加載的角度設計了一種有針對性的地形塊動態(tài)調(diào)度算法。該算法在本文中具有以下特點: 1) 從模型資源的角度入手加載地形,使地形資源與其他仿真對象加載方式相同,同時避免了對DEM數(shù)據(jù)的大量處理工作,實現(xiàn)方式便捷高效: 2) 以視點位置為中心進行地形塊動態(tài)調(diào)度,在大場景漫游過程能夠保持流暢瀏覽同時降低計算機性能消耗: 3) 詳細解析了內(nèi)存中地形加載和卸載過程,對于控制仿真對象的資源占用和優(yōu)化有重要作用。實驗證明該算法能維持地形資源的內(nèi)存消耗在較低水平,同時顯著提升幀率。目前該算法已經(jīng)應用在牽引供電系統(tǒng)三維培訓仿真中應用并取得良好效果。
[1] 韓敏,湯松濤,李洋.大規(guī)模地形實時可視化算法[J].計算機工程,2008,34(13):270-272.
HAN Min, TANG Songtao, LI Yang. Real-time Visualization Algorithm of Large-scale Terrain[J]. Computer Engineering,2008,34(13):270-272.
[2] 宋力兵,龔華軍,王新華.基于改進的約束四叉樹LOD全球地形實時繪制[J].計算機與數(shù)字工程,2013,41(10):1668-1671.
SONG Libing, GONG Huajun, WANG Xinhua. Global Terrain Real-Time Rendering Based On Improved Constraint Quad-Tree and Level of Detail Algorithm[J]. Computer & Digital Engineering,2013,41(10):1668-1671.
[3] 李玉娟,譚同德.三維場景中大規(guī)模地形地貌的生成[J].計算機應用與軟件,2013,11:131-135.
LI Yujuan, TAN Tongde. The Generation of Lager-scale Terrain and Topography in 3D Scene[J]. Computer Applications and Software,2013,11:131-135.
[4] Zhou Z, Cai B, Zhang D, et al. Paged cache based massive terrain dataset Real-Time rendering algorithm[C]//Information Engineering and Computer Science, 2009. ICIECS 2009. International Conference on. IEEE,2009:1-4.
[5] 李欽,戴樹嶺,趙永嘉,等.分塊LOD大規(guī)模地形實時渲染算法[J].計算機輔助設計與圖形學學報,2013,25(5):708-713.
LI Qin, DAI Shuling, ZHAO Yongjia, et al. A Block LOD Real-time Rendering Algorithm foe Large Scale Terrain[J]. Journal of Computer-Aided Design & Computer Graphics,2013,25(5):708-713.
[6] 姜昱明,胡曼麗.地形漫游中數(shù)據(jù)塊調(diào)度算法研究[J].計算機工程與設計,2007,28(15):3743-3745.JIANG Yuming, HU Manli. Research on Block Scheduling Algor-ithm for Terrain Walkthrough[J]. Computer Engineering and Design,2007,28(15):3743-3745.
[7] 王響,雷小永,戴樹嶺.基于視點預測的大規(guī)模地形的實時渲染[J].系統(tǒng)仿真學報,2013,6:1202-1206.
WANG Xiang, LEI Xiaoyong, DAI Shuling. Real Time Rendering of Large Scale Terrain Based on Viewport Prediction[J]. Journal of System Simulation,2013,6:1202-1206.
[8] Unity Technologies. Unity4.x從入門到精通[M].第1版.北京:中國鐵道出版社,2013.
Unity Technologies. Unity4.x From Entry to Master[M]. 1st Edition. Beijing: China Railway Publishing House,2013.
[9] 石敏,王俊錚,魏家輝.真實感三維虛擬場景構(gòu)建與漫游方法[J].系統(tǒng)仿真學報,2014,9:1969-1974,1979.
SHI Mi, WANG Junzheng, WEI Jiahui. Virtual Scene Contruction and Roaming[J]. Journal of System Simulation,2014,9:1969-1974,1979.
[10] 王朋,劉惠義,楊戰(zhàn)軍.基于Geometry Clipmap的大規(guī)模地形繪制算法[J].計算機與數(shù)字工程,2015,43(5):887-891.
WANG Peng, LIU Huiyi, YANG Zhanjun. A Large Scale Terrain Rendering Algorithm Based on Geometry Climap[J]. Computer & Digital Engineering,2015,43(5):887-891.
[11] Hog.全面理解Unity加載和內(nèi)存管理[EB/OL]. (2012-10-11) [2016-02-03]. http://game.cee-ger.com/forum/read.php?tid=4394#info.
Hog. Comprehensive Understanding of Unity Loading and Memory Management[EB/OL]. (2012-10-11) [2016-02-03]. http://game.cee-ger.com/forum/read.php?tid=4394#info.
[12] Hog.全面理解Unity加載和內(nèi)存管理機制之二:進一步深入和細節(jié)[EB/OL]. (2012-10-15) [2016-02-03]. http://game.ceeger.com/forum/read.php?ti=4466.
Hog. Fully Understand the Unity Loading and Memory Management Mechanism of the Two: Further in Depth and Detail[EB/OL]. (2012-10-15) [2016-02-03]. http://game.ceeger.com/forum/read.php?ti=4466.
[13] Tnqiang. Unity內(nèi)存申請和釋放[EB/OL]. (2014-07-01) [2016-02-03]. http://www.jianshu.co-m/p/b37ee8cea04c.
Tnqiang. Unity Memory Application and Release[EB/OL]. (2014-07-01) [2016-02-03]. http://www.jianshu.co-m/p/b37ee8cea04c.
Dynamic Scheduling Algorithm of Terrain Blocks Based on Unity Engine
GENG XiaoHAN ZhiweiLIAO Feng
(School of Electrical Engineering, Southwest Jiaotong University, Chengdu610031)
In order to solve the problem that the utilization rate of memory was high when large-scale terrain blocks were loaded in the process of 3D simulation based on Unity, a dynamic scheduling algorithm of terrain blocks was proposed in this paper. The projection of the viewpoint in the terrain flat was chosen as the center of the current terrain, and the terrain blocks surrounding it were loaded. When the viewpoint was moving, according to the change of the coordinate of its projection point in the terrain flat, the area of the terrain blocks needing to be loaded and unloaded were calculated. In this paper, the dynamic scheduling algorithm of terrain blocks was realized based on the memory management strategy of Unity. The experiment results showed that the algorithm can effectively reduce the memory usage in terrain loading and increase the frame rate of the 3D simulation.
terrain blocks, dynamic scheduling, viewpoint position, memory management, three-dimensional simulation
2016年3月8日,
2016年4月17日
國家自然科學基金(編號:51407147)資助。
耿肖,男,碩士研究生,研究方向:牽引供電系統(tǒng)三維建模與仿真。韓志偉,男,博士,講師,研究方向:計算智能理論在鐵路和電力系統(tǒng)中的應用。廖峰,男,碩士研究生,研究方向:牽引供電系統(tǒng)三維仿真。
TP391DOI:10.3969/j.issn.1672-9722.2016.09.001