[遊戲引擎開發#3]隱而不現的動脈--資源管線

(又鴿了一段時間,數據太差了沒動力)你有沒有想過,你玩的遊戲中的圖片,動畫,文字是怎麼來的呢? 聰明的你肯定會說:"渲染啊,我直接一個大渲染下去,屏幕上就呈現了",看了標題的朋友們就知道這期我想說的不是渲染,它是一個更底層的東西--"資源管線",它是引擎的動脈爲各個組分提供營養物質,將所有上層的資產轉爲引擎能看懂的數據,引擎再將這些數據分別給音頻系統,渲染系統,輸入系統等使用.

這個過程看起來很簡單,實際上也確實很簡單,假如我們現在有了一張圖片了,如何讓引擎知道這是我們項目的資產呢,在Unity中你可以通過拖拽圖片來導入,這時你可以看到一個進度條,這是Unity在導入資產,細心的你會發現導入位置不僅有原始的圖片,還有一個同名的.meta,那麼這個.meta文件是什麼?你用編輯器打開你就會發現這裏面寫了很多東西,它就像是一個個人信息文檔,名字,身份證,物種,然後是其他相關信息,引擎拿到這份信息,就可以根據物種,分別處理.所以我們需要一個角色看門的大爺--導入器,外部人員想進去,必須得經過大爺"檢查",檢查好後才能進去,它只負責兩件事,導入資產,重新導入資產,比如一張圖片,導入器會先解析數據,然後將重要信息寫入meta信息,比如長寬,格式,然後對於圖片進一步,我們可以把圖片直接解碼爲GPU壓縮格式(DXT,ASTC等)減少引擎工作.

現在我們有了meta信息了,我該怎麼加載,然後供給給系統呢?聰明的你肯定能想道:"簡單啊,我把meta信息交給系統,讓它們直接處理就行",沒錯這樣是可行的,不過這樣會讓系統的維護變得很艱難,又要寫導入又要寫處理,就會變成一團亂麻了,當其他系統也需要使用這些資產時這就更復雜了,所以我們得抽象出一個層次出來:加載器,顧名思義,是用來加載的,它負責將導入器導入的meta信息經過處理後變成引擎內部資產,比如一張圖片,引擎是無法直接渲染的,它必須要經過加載解碼後壓縮成GPU格式的紋理上傳到GPU,這時渲染系統就可以渲染這張圖片了.

這樣的導入器和加載器我們只需要多創建幾個,比如:字體,場景,音頻等等,都可以重複上述的流程,這樣我們有了新類型的資產就只需要新建加載器和導入器和處理系統就行了!萬金油公式!不過呢,你肯定也看出來了弊端,加載器每次都在從meta中加載數據到內存中,如果重複加載一張圖片,每次都會重新加載,這樣肯定是不行的,所以我們引入第三個層次--緩存器,它就是資源管線的倉庫管理員,我在加載前問一下它:"喂?你給我查查這個身份證的人是不是在廠裏上班",如果在的話緩存器就回復:"老闆,在的在的,這個人我馬上給你帶過來"然後緩存器就把人提出來,帶到加載器,加載器就不需要每次都完整的重新加載,既節省了時間又省了空間,一般查詢的時間複雜度只有O1!也就是說我只需要一次cpu時間就可以知道有沒有加載過了(一般現代CPU的時鐘爲億次/s起步),額外開銷幾乎爲0!

我們只需要遵循上面的導入器-加載器-緩存器的結構就可以搭建一個現代化的可擴展的資源管線,而且特別建議自己寫引擎時,先把資源管線寫好了,而不是先去寫渲染,今天說:"你看我這實現了一個超棒的渲染效果",第二天又說:"我的輸入系統支持全設備!",看不見的資源管線纔是最重要的,所有的髒活累活都幹了,爲整個引擎灌輸引擎,所以你要寫引擎就先寫好一個優秀的資源管線.

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com