May 6
使用sqlite打包游戏数据
游戏开发
最近一直在思考游戏资源包的设计, 在以前<天下贰>项目的打包方案中最大的问题是每个版本生成的patch文件都必须顺次运用, 而且之前的版本是基于2进制数据比较,产生一个补丁包,这对于频繁修改的美术资源,描述这个2进制数据比较的补丁包,很有可能比直接替换一个文件,尺寸要更大,不如直接在文件粒度上修改数据,而不是2进制的数据比较补丁.
这次的新项目想尝试一种的新的包结构, 经过慎重思考,打算采用sqlite作为包文件载体,sqlite是一种小型的桌面数据库,从官方的介绍来看,也有很多公司采用sqlite作为文件格式使用,甚至使用在便携式设备内,可见其经济小巧的设计.
简单来讲,游戏数据打包,就是把各种文件放入一个大文件管理,这样做的目的主要是加快磁盘io和减少磁盘碎片,当然还有一个目的是加密文件格式,不至于dds,model文件直接暴露在文件夹里. 对于sqlite来讲, 因为其支持blob格式的字段, 所以很简单就是创建一个表,把所有的文件以blob字段的形式放入表中,为了便于检索,在创建主键,主键可以直接是文件名或者hash(文件名)得到的数字, 这个表的sql语句就是:
create table fat ( id integer primary key, content blob );
这样文件打包/patch更新就完全交给sqlite, 使用sql语句就可以搞定那些复杂的数据插入,修改,原子性和文件系统的线程安全性.
目前这部分已经集成到了引擎文件系统里, 实际的io效率还有待测试, 说实话还是有点担心其select的操作同完全手写的map.find(id)有多大差别,下次经过测试,再写篇评测报告.
2010-05-06 22:39:08 回复该留言
我曾用 BSDDB 做过文件系统,打 patch 和 make diff 都非常容易。后来发现这玩意不能用免费用在商业项目,哈哈。