遊戲資源打包方法總結

來源:互聯網
上載者:User

雖然資源打包是個基本問題,但我幾乎沒見過有人談過。所以自己總結一下。
本文貼在csdn n5 blog上( blog.csdn.net/n5 ),轉載請保持完整性。另外本文是持續補充和更新的。

首先,定義兩個名詞。
block :打包資料的單位,可以是一個檔案也可以是一個資料區塊。總之是資源套件中的一塊資料。
包,資源套件:即包含多份資料的一個檔案。

1 block size + block data 
  按資料區塊大小+資料區塊內容的方式將一批資料區塊逐個打包。這是比較簡單實用的方法。往往還需要產生一個文字檔指明每個資料區塊是什麼內容。如果按照預設順序打包和讀取就不需要了。
這種方法主要用於包中的資料需要全部同時讀出的情況。因為這種格式的包,從中間單獨抽取某個資料區塊讀出比較麻煩。只能跳過若干資料區塊。

2 offset table + block datas
 這種方式下,首先在包頭部寫入一個offset table,即每個資料區塊在包中的起始位置。然後將所有資料區塊的內容逐個寫入包中。這個offset table條目數一般比block數大1,這樣
table[0]=0
table[1]=block 0 size
table[2]=block 1 size + table[1]
table[3]=block 2 size + table[2]
......
table[n]=block n-1 size + table[n-1]
(block從0開始計數,共n個[0,n-1])
 讀取的時候,根據block id,先在table中查到table[id]和table[id+1], 兩者之差就是block size.table[id]是block地址。
當然也需要一個配套的文字檔記錄每個block id對應的內容。
這種方式的好處是可以唯讀出需要的內容。且table所佔的容量只比第一種方式稍大。是非常實用的方式。

3 trunk 方式
首先定義trunk:block id + block size + block data
只比第一種方式多了一個block id。但靈活性提高了。因為可以根據id判斷當前的block是否是需要載入的。如果是就載入否則跳過這個block接著看下一個block,直到找到或沒找到需要載入的block。block id不但可以指明資料區塊在同質資料中的id,而且可以指明是哪一種資源,這樣就可以把不同種類的資源打包到一起。當然在前面的方式中可以在資料區塊中包含資源類型,但靈活性就差了,特別是必須在所有類型的資料區塊中統一寫一些資料在相同位置來表示資源類型。而在trunk方式中,只要在block id中取一些位來定義資源類型,然後根據資源類型調用不同類型的載入函數去讀取資料是相當靈活的。trunk方式的缺點是讀取速度稍慢,因為必須一個個找過去。

4 file name 索引方式
不知道除了我有沒有人用過這種方式,這是一種偷懶的方式。打包對象是檔案。先在包頭部寫入一個檔案名稱和offset 映射表。檔案名稱按字串寫入包中,所以這之前要寫入檔案名稱的位元組數。
映射表的結構為: 檔案名稱位元組數+檔案名稱字串+檔案offset
當然檔案名稱必須用ascii編碼。這兒還有個變通的方式。你可以用utf-8格式的編碼,就不需要寫檔案名稱自己數了。
映射表之後就按順序寫入檔案。
這種方式其實是offset table 方式的一種變體。不同的是直接將檔案名稱寫入包中。讀取時可以指定檔案名稱從包中讀出,根從持久性裝置上讀單個檔案的感覺一樣。不必再定義額外的檔案檔案表明每個資料區塊的含義了。所以是一種比較懶的方式。缺點是浪費容量。

小結:
以上4種方式各有用處,用的最多的是offset table和trunk方式。此文需要持續補充更正完善

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.