Awesome
u-mpq
类似暴雪MPQ归档资源打包和读取工具
MPQ文件简介
在游戏制作中,会有很多资源,比如图片,json,txt,xml等各种游戏资源。如果直接将这些文件放在游戏包的目录下, 会造成碎文件过多,影响文件读取速度。 同时,很多游戏都有热更新, 需要对游戏资源做增量更新。比如初始包体是100M,后面更新了部分资源,需要在已有的包体运行初始化的时候,下载这部分改动或者添加的资源。
之前暴雪针对这些需求,实现了一个优化了的资源归档格式——MPQ。 该工具在其理论基础上, 针对手游做了一些调整和简化,但是原理一致。
这个工具的作用可以简单地概括为两句话:
1、将指定目录下的所有变更或者新增的资源,打包生成一个新的mpq文件。 2、程序运行时, 从mpq中读取资源时,自动采用较新的资源。
目录结构
mpqpacker:
----mpq.py MPQ打包工具脚本,需要安装python 2.*版本。建议安装python 2.7.10以上版本
MPQReaderForCSharp:
----MPQFileSystem.cs:MPQ文件格式,C#解析类, 使用该类进行mpq文件的读取
----其他辅助类
使用说明
1、打包方式:
python mpq.py [MPQ target dir] [Res source dir]
比如:
python mpq.py ./GameUpdates ./GameResources
就是将GameResoures下面所有的资源, 生成一个mpq文件,到GameUpdates目录下
2、解压方式:
如果要解压已经存在的mpq文件,则使用如下命令
python mpq.py -d [MPQ dir] [Res target dir] -- 将[MPQ dir]目录下的mpq文件,解压到[Res target dir]目录下
比如:
python mpq.py -d ./GameUpdates ./GameResources
就是将GameUpdates目录下所有的mpq文件中的资源文件, 解压生成到GameReosurces目录下。
3、程序中使用方式(C#):
初始化,指定mpq所在目录:
string path = "C:/game/res"; //游戏中mpq资源所在目录
MPQFileSystem mpqFileSystem = new MPQFileSystem();
mpqFileSystem.Init(new DirectoryInfo(path));
从mpq文件中读取指定的资源:
string path = "/assets/res/test.xml"; //在mpq中的文件,相对路径
byte[] ret = this.mpqFileSystem.ReadData(path);
这样就从MPQ文件中读取出了指定资源文件的二进制数据。
4、实际使用建议:
4.1、mpq作为资源增量打包和读取方式
4.2、对生成的mpq文件进行gzip压缩
4.3、对mpq文件生成文件索引文件, 做资源更新和检查。 游戏中初始化的时候, 先判断资源服务器上是否有新资源mpq文件, 有的话就下载, 然后程序解压并读取。