`
v5qqcom
  • 浏览: 1285401 次
文章分类
社区版块
存档分类
最新评论

游戏资源打包方法总结

 
阅读更多

虽然资源打包是个基本问题,但我几乎没见过有人谈过。所以自己总结一下。
本文贴在csdn n5 blog上( blog.csdn.net/n5 ),转载请保持完整性。另外本文是持续补充和更新的。

首先,定义两个名词。
block :打包数据的单位,可以是一个文件也可以是一个数据块。总之是资源包中的一块数据。
包,资源包:即包含多份数据的一个文件。

1block size + block data
按数据块大小+数据块内容的方式将一批数据块逐个打包。这是比较简单实用的方法。往往还需要生成一个文本文件指明每个数据块是什么内容。如果按照默认顺序打包和读取就不需要了。
这种方法主要用于包中的数据需要全部同时读出的情况。因为这种格式的包,从中间单独抽取某个数据块读出比较麻烦。只能跳过若干数据块。

2offset 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所占的容量只比第一种方式稍大。是非常实用的方式。

3trunk 方式
首先定义trunk:block id + blocksize + block data
只比第一种方式多了一个block id。但灵活性提高了。因为可以根据id判断当前的block是否是需要载入的。如果是就载入否则跳过这个block接着看下一个block,直到找到或没找到需要载入的block。block id不但可以指明数据块在同类数据中的id,而且可以指明是哪一种资源,这样就可以把不同种类的资源打包到一起。当然在前面的方式中可以在数据块中包含资源类型,但灵活性就差了,特别是必须在所有类型的数据块中统一写一些数据在相同位置来表示资源类型。而在trunk方式中,只要在block id中取一些位来定义资源类型,然后根据资源类型调用不同类型的载入函数去读取数据是相当灵活的。trunk方式的缺点是读取速度稍慢,因为必须一个个找过去。

4file name 索引方式
不知道除了我有没有人用过这种方式,这是一种偷懒的方式。打包对象是文件。先在包头部写入一个文件名和offset 映射表。文件名按字符串写入包中,所以这之前要写入文件名的字节数。
映射表的结构为: 文件名字节数+文件名字符串+文件offset
当然文件名必须用ascii编码。这儿还有个变通的方式。你可以用utf-8格式的编码,就不需要写文件名自己数了。
映射表之后就按顺序写入文件。
这种方式其实是offset table 方式的一种变体。不同的是直接将文件名写入包中。读取时可以指定文件名从包中读出,根从持久性设备上读单个文件的感觉一样。不必再定义额外的文件文件表明每个数据块的含义了。所以是一种比较懒的方式。缺点是浪费容量。

小结:
以上4种方式各有用处,用的最多的是offset table和trunk方式。此文需要持续补充更正完善

分享到:
评论

相关推荐

    Unity3D游戏开发基础视频全教程(含基础入门,知识体系,3D特效入门等)

    资源为TXT文件,内含下载链接及提取码以及资料详情,保你下载绝不会后悔! 如没有BD网盘会员,建议下载个“speedpan速盘破解版...第19课:PC端游戏打包与发布.mp4 第20课:新手入门总结.mp4 更多资料 见txt文档介绍!

    【QT】20 翻金币项目

    翻金币小游戏实现,包括项目打包 博客资源:https://blog.csdn.net/qq_36926037/article/details/123880556

    JAVA项目开发全程实录(含电子书和所有源代码)

    6.7 资源管理模块设计 261 6.7.1 名片夹管理功能概述 261 6.7.2 名片夹管理功能技术分析 262 6.7.3 名片夹管理功能实现过程 262 6.8 发送短信模块设计 270 6.8.1 发送短信模块功能概述 270 6.8.2 发送短信模块技术...

    android开发资料大全

    最无私的Android资料(书籍+代码)分享[总结] Android中文帮助教程(非常合适新手入门) android程序编写及调试新手入门 大家一起学Android(Windows篇) android入门与提高必看指南 Android入门逆引手册 Android...

    vc++ 应用源码包_1

    演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示...

    vc++ 应用源码包_2

    演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示...

    vc++ 应用源码包_3

    演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示...

    vc++ 应用源码包_6

    演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示...

    vc++ 应用源码包_5

    演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示...

    vc++ 开发实例源码包

    演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示...

    图库新版jQuery焦点图 JS代码

    tips[36] = '所谓“网站定位”就是实事求是的基于各种现状总结出一个对内容建设、功能规划、服务运营有帮助的指导纲领。'; tips[37] = '不要相信“天下设计一大抄”我们可以借鉴,但绝不能抄袭!'; tips[38] = '学...

    网管教程 从入门到精通软件篇.txt

    小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。  Bootcfg  bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。  含有下列参数的 bootcfg 命令仅在...

Global site tag (gtag.js) - Google Analytics