標籤:

Unity3D資源管理

每個遊戲都是有種類繁多的資源(有時候稱為資產或媒體的構成),例如網路、材質、紋理、著色器程序、動畫、音頻,關卡布局、碰撞數據、物理參數等。遊戲資源必須妥善保管,這包括兩方面,一方面是建立資源的離線工具,一方面是在執行期載入,卸下及操作資源。因此,每個遊戲都有某種形式的資源管理器。

每個遊戲資源管理器都有兩個元件組成,這兩個元件及獨立又相互整合。其一負責離線工具鏈,用來創建資產及把它們轉換成引擎可用的形式,另一個元件在執行期間管理資源,確保資源在使用之前已轉入內存,並在不需要的時候把它們從內存卸下。

在某些引擎中,資源管理是一個具清晰設計、統一、中心化的子系統,負責管理遊戲中用到的所有類型資源。其他引擎的資源管理器本身不是單獨子系統,還是想布局不同子系統中,或許這些子系統是有不同作者經過引擎,漫長也許多姿多彩歷史而寫成的,但無論資源管理器是如何實現的,他主要負起某些責任,並解決一些明確定義的問題。本節會探討典型遊戲引擎資源管理功能,以及其實現細節。

離線資源管理及工具鏈

6.2.1.1資產的版本控制

解決數據量的問題

6.2.1.2資源資料庫

  • 能處理多種類型的資源,理想的(但肯定非必要)是以一致的方式處理
  • 能創建新資源
  • 能刪除資源
  • 能查看及修改現存的資源
  • 能把資源從一個位置移至另一個位置。(這是非常有用的因為美術人員及遊戲設計師經常要重新安排資產,以反映項目目標的改動、重新思考遊戲設計、新增或取消特性等)
  • 能讓資源交叉引用其他資源(例如,網路引用材質,某關卡引用一組動畫)。交叉引用通常同時驅動資源管理生成過程及運行是的載入過程
  • 能維持資料庫內所有交叉引用的引用完整性。執行所有常見操作後,如刪除或移除資源,仍能保持引用完整性
  • 能保存版本歷史,並含完整日誌記錄改動者及事由。
  • 資源資料庫若能支持不同形式的搜尋及查詢,將十分有用。例如,開發者可能想了解哪一關卡用了某動畫、哪些材質引用了某紋理。

6.2.1.3一些成功的資源資料庫設計

虛幻3

  • 虛幻的資源資料庫由其萬用工具UnrealEd所管理。UnrealEd幾乎負責一切事項,無論資源元數據管理、資產創建、關卡布局等都一律包辦。好處在於是遊戲引擎的一部分,還有一站式購物。
  • 缺點是包文件是二進位的,不能合併;資源重新命名或移動後,產生虛擬對象。

頑皮狗的《神秘海域:德雷克船長的寶藏》引擎

  • 粒度小的資源
  • 必需的特性
  • 顯而易見的源文件映射
  • 容易更改DCC數據的導出及處理方式
  • 容易生成資產
  • 欠缺可視化工具
  • 工具沒有完全整合

6.2.1.4資產調節管道

多數資源數據會經由資產調節管道(assertconditioning pipeline)才能成為遊戲引擎所用的數據。

  • 導出器
  • 資源編譯器
  • 資源鏈接器

6.2.2運行時資源管理

6.2.2.1 運行時資源管理器的責任

  • 確保任何時候,同一個資源在內存中只有一份
  • 管理每個資源的生命期,載入需要的資源,並不在需要的時候卸載
  • 處理複合資源的載入。複合資源是由多個資源組成的資源
  • 維護引用完整性。
  • 管理資源載入後的內存用量
  • 容許按資源類型,載入資源後執行自定義的處理
  • 通常提供單一統一介面管理多種資源類型
  • 若引擎支持,則要處理串流(即非同步資源載入)

6.2.2.2 資源文件及目錄組織

通常是樹狀目錄

把多個資源包裹為單一文件,優點是減少載入時間。從文件載入數據時,三大開銷為尋道時間(即把磁頭移動至物理媒體上正確的位置時間)、開啟每個月文件的時間及從文件讀入數據至內存的時間。

OGRE渲染引擎的資源管理器同時支持兩種模式,可把資源文件各自配置於硬碟上,也可以把資源置於龐大的ZIP存檔中,使用ZIP格式的好處有:

1.ZIP是開放格式

2.ZIP存檔內的虛擬文件也有相對路徑

3.ZIP存檔可被壓縮

4.ZIP存檔可視為模塊

6.2.2.3 資源文件格式

每類資源都可能有不同的文件格式。一類是使用開放標準的格式。

一類是自定義的文件格式。原因是,引擎所需的部分信息可能沒有標準格式可以儲存,對資源做離線處理,藉以降低運行時載入資源的時間。

6.2.2.4 資源全局統一標識符

常見GUID選項就是資源的文件系統路徑。

6.2.2.5 資源註冊表

載入內存的每個資源只會有一個副本,大部分資源管理器都含有某種形式的資源註冊表。常見是使用字典,即鍵值對。載入資源是緩慢操作,因為涉及對硬碟上文件定位及開啟,讀取可能大量的數據至內存,並且有機會在資源數據載入後,執行其載入後初始化工作。載入資源可能對遊戲幀率造成非常明顯的影響,甚至是幾秒的停頓。

處理方式有兩種,1在遊戲進行中,完全禁止載入資源。2.資源以非同步形式載入

6.2.2.6 資源生命期

資源的生命期定義為該資源載入內存後至內存被歸還做其他用途之間的時段。

  • 必須開始時便載入。
  • 有些資源的生命期能對應某遊戲關卡
  • 有些短於所在關卡的時間
  • 有些資源如背景音樂等,在播放時即時串流。

6.2.2.7 資源所需的內存管理

資源管理和內存管理息息相關。有些資源必須駐留在顯存,包括紋理、頂點緩衝、索引緩衝、著色器。大部分其他資源可能都會駐留在主內存。

基於堆的資源分配,會有造成內存碎片問題,遊戲運行在個人計算機上,支持高級的虛擬內存分配。

基於棧的資源分配,只適用於1是遊戲是線性以及關卡為中心。2是內存足夠容納各個完整關卡。

基於池的資源分配

把資源數據以同等大小的組塊載入,因為全部組塊的大小相同,可以使用池分配器。「組塊式」資源分配天生具有一個取捨問題,這就是空間浪費。除非是資源大小剛好組塊大小的倍數。

資源組塊分配器

設立特殊內存分配器,此分配器能利用組塊內未使用的部分。管理一個鏈表。資源組塊中未使用的區域釋放。大部分遊戲引擎在載入資源時都需要分配動態內存,可以使用這種方法。

分段的資源文件

典型的資源文件可能包含1~4段,每段分為一個或者多個組塊,以配合基於池的資源分配。

6.2.2.8 複合資源及引用完整性

遊戲資源資料庫可表達為,有互相依賴的數據對象所組成的有向圖。數據對象之間的交叉引用可以是內部的或者外部的。

6.2.2.9 處理資源建的交叉引用

使用全局統一標識符做交叉引用,就是把交叉引用儲存為字元串或散列碼,內含被引用對象的唯一標識符。

指針修正表 儲存對象至二進位文件的方法,把指針轉換為文件偏移值,把指針的位置存儲到一個簡單列表,此表就是指針修正表。

處理外部引用,除了要指明偏移值或GUID,還需加上資源對象所屬文件的路徑。載入由多個文件組成的資源,關鍵在於要先載入所有互相依賴的文件。

6.2.2.10載入後初始化

兩種情況

  • 某些情況下,載入後初始化是無法避免的步驟。定義三維網格的頂點和索引值,載入主內存後,要傳送至顯存。
  • 某些情況下,載入後初始化是可避免的。將算好的數據加入,避免運行是計算的開銷。

以上內容來自《遊戲引擎架構》第六章第二小節資源管理器,關鍵內容的筆記


Unity3D 情況

Unity3D 支持資源格式,可以看官方文檔。

任何資源導入有Importing Assets

 在這個步驟中,Unity3D針對所有的資源生成metadata,並進行「編譯」、「鏈接」,轉換為遊戲可以直接使用的資源。轉換前的資源保存在「Assets」中,轉換後的資源保存在「Library」中,所有的資源在Inspector面板中可以修改metadata的數據,如下圖

shaderCache是編譯好的在PC下的shade文件。

對於Android或者ios版本都是把資源編程成對應平台的資源,打進包里。

如果使用SVN等版本控制器,需要同步所有資源及其metadata。打開Edit->Project Settings->Editor,將Mode修改為「Meta Files」(默認「Disabled」),如下圖

關於項目中資源處理的工具

項目中BundleManage中是官方商店BundleManager針對項目修改後的版本,簡單介紹

下圖看到項目資源的目錄結構

亮光選中的bundle,看右上方可以到size是364k,包含UI預製件有哪些,依賴美術資源有那些。帶黃色標識的是表示這個資源其他地方重複引用了。

下圖表示是在android和ios平台下圖片格式的設置。

資源管理器中數據結構,用JSON做數據保存。

如果有複合資源的情況就放到根節點,資源載入會去把根節點載入,才會去載入子節點下的內容。

當生成移動平台的包,這裡用android舉例。在遊戲啟動的適合,從伺服器上獲取版本號,做對比,是否要更新資源。對比crc以及是否有本地緩存等等。

這是我經歷項目里,表格、配置使用的XML和Lua代碼同樣也是可以作為資源熱更新的。

在開發運行狀態下,有List維護所有載入中的資源,並顯示有多少處引用,確保每個資源用完即卸載。

優勢是:在項目中使用的是編譯的好資源,重新拉工程減少編譯美術資源的時間。更新的時候可以小包更新,會在比對後是用本地還是從伺服器拉取最新的。

缺點是:因使用md5所以,不能支持多人同時對資源打包;其次是更新的是要把整個Bundle包都上傳到伺服器,因上傳時間有點長。當有節點有變化,或者有資源移動位置的時候都需要重新打包所有資源。有時出現問題需要強制打包所有的資源。

本文標題:資源管理

文章作者:zhutaorun

發布時間:2018-01-31, 12:16:18

最後更新:2018-02-01, 01:31:12

原始鏈接:http://zhutao.github.io/2018/01/31/資源管理/

許可協議: "署名-非商用-相同方式共享 4.0" 轉載請保留原文鏈接及作者。

推薦閱讀:

說說《火柴人越獄記》有什麼優點?
中國版的Minecraft語言錯誤,如何才能使它變成中文?
《刺客信條:梟雄》中的大英帝國興衰史
小眼先生&中井和哉——AOV中日龍馬的錄音過程
《虛榮》國服地圖是怎麼樣的?

TAG:遊戲 |