遊戲資源打包幾乎是一個網路遊戲用戶端必備的功能。頁遊和微端根據實際需求可能不打包資源或者使用小包。
資源打包有這麼幾個好處:
1、加快用戶端安裝時間。拷貝3000個1mb檔案所消耗的時間要遠大於拷貝一個3g的檔案所消耗的時間
2、用戶端更加整潔,也可以“稍微”避免遊戲資源被他人使用。
3、ios和android上面可以避免檔案名稱大小寫不一致造成的檔案讀取失敗。或者說包內可以做到全平台大小寫無關
4、壓縮資源,如果是大量png等圖片資源可能還體現不出來,但是如果有大量文本和未壓縮模型資源,那麼打包可以有效減小用戶端
這裡介紹兩個開源庫,可以非常方便的給用戶端加入資源打包功能。
1、StormLib(http://www.zezula.net/en/mpq/stormlib.html),這個就是暴雪MPQ打包格式開源實現版本。通過這個庫可以輕易的實現一個PackageManager來載入包內資源
2、ZPack (http://multi-crash.com/?page_id=340) 這個同樣是一個開源打包格式實現。對比上面的MPQ,它更精簡,當然功能也更弱一些。不過現有的一些功能已經完全能滿足我的實際需求了
主要特性:
- 速度
- 以檔案名稱hash方式檢索,讀取效率至上
- 刪除包內檔案時,只刪除檔案索引,不需要移動包內資料
- 在兩次flush之間使用者可以添加任意多個檔案(例如添加整個目錄),這期間除了被添加檔案資料的寫入,沒有任何其它多餘的檔案IO操作
- 尺寸
- 添加檔案時,優先插入到之前刪除檔案留下的空閑位置,儘可能利用空間
- 使用者可以調用countFragmentSize檢查當前包內空閑空間位元組數,必要的話可以調用defrag進行整理以釋放空間
- 暫不支援資料壓縮,但使用者很容易自行添加壓縮支援
- 安全/健壯
- 嚴格保證在使用者調用flush()之前,包檔案的有效性。這樣當使用者一次添加/刪除較多檔案的過程中即使發生意外(例如停電,進程被強行終止等),包檔案能保持最後一次flush後的邏輯結構,不會發生災難性後果
- 包檔案以唯讀方式開啟時,原始的檔案名稱資訊不會被載入到記憶體。也就是說使用者可以選擇不將原始目錄結構和檔案名稱寫入包內,包檔案仍然能正常讀取
- 可擴充/相容
- 從設計上保證當將來需要擴充包檔案頭或包內檔案索引中的資料時,老的代碼仍能讀取新的資料結構
- 當資料包和zpEditor版本不一致時,zpEditor仍可以以唯讀模式開啟資料包
- 工具
- 雖然包內檔案是以扁平方式組織(以保證檢索效率),但zpack另外提供工具類ZpExplorer,讓使用者可以以樹狀目錄形式瀏覽和編輯包內檔案
- 提供命令列工具,接近dos使用習慣
- 提供類似windows explorer的編輯器
- 其它
- 包檔案不受4g大小限制
- 核心讀模數塊僅依賴c++標準庫,很容易移植到windows以外的平台,例如Linux,Mac,iPhone等
- 代碼小巧精簡,不提供任何多餘介面。zpack核心原始碼僅20k左右
一個打包模組只要能滿足這麼幾個需求就完全夠使用了:
1、hash的平鋪路徑,保證足夠的尋找效率
2、支援壓縮
3、安全,健壯,不會因為一些操作造成包損壞
最後感慨下,開源世界太豐富了,多瞭解一些開源項目就可以省去很多自己重新創造所需要的時間了。