游戲資源打包幾乎是一個網絡游戲客戶端必備的功能。頁游和微端根據實際需求可能不打包資源或者使用小包。
資源打包有這么幾個好處:
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、安全,健壯,不會因為一些操作造成包損壞
最后感慨下,開源世界太豐富了,多了解一些開源項目就可以省去很多自己重新創造所需要的時間了。
