游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6995|回复: 9

一个简单实用的资源包机制

[复制链接]

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2010-7-27 22:48:00 | 显示全部楼层 |阅读模式
本帖最后由 niexuchina 于 2015-10-25 13:46 编辑

本贴只说明基本流程和机制,不包含具体细节。

这个机制:
·已在游戏(http://xwb.gyyx.cn/)中经过考验。
·支持跟新。包括删除、添加。磁盘容量基本没有浪费。
·对于跟新当中的比如断电、磁盘满等导致失败的情况做了处理:)。不错吧。


***包的基本格式***

资源包主要有一个一个连续的数据块和文件头组成。每一个数据块就是源文件的内容。文件头是每个小文件信息,每条信息包含key(我们用标准化后的相对路径)、偏移量、大小。文件头存在资源包的末尾。

资源包的格式示意如下:
// Data section
FileDataBlock
FileDataBlock
...
// Info section
FileInfo
FileInfo
...
// Tail section
InfoSectionBeginOffset
Version

每一条FileInfo格式为
Path
FileOffset
FileSize

***读取***

通过head section的信息,加载所有FileInfo,将path作为key,保存在一个map中。我们采取将整个子文件加载到内存的方式。

***跟新***

这是一个有点纠结的部分。最开始的版本因为未考虑到中途失败的情况,导致一旦失败,资源包的info section被破坏,玩家必须重新下载整个游戏,才能继续升级。失败吧:)。

要点:
·info section在跟新前必须备份。
·删除的文件,只从info section中去掉。
·新添加的文件,优先写到前面的空挡中。
·最后将新的info section以及后面的信息追加的包文件末尾。
·子文件的跟新相当于删除老的,再添加一个同名新文件。

跟新流程:
1、读取info section备份文件,一个固定名字的文件。
2、用存在备份文件末尾的校验码对该文件进行校验。
3、如果读取失败或者校验失败,说明根本没有备份或者之前的备份失败了,则备份info section。当然最后存上校验码。
4、读取info section,他可能来自包文件或者备份,并构建一个data section空挡的列表。
5、对于删除文件,直接从内存里的info section将它的记录去掉,并更新空挡列表。
6、对于添加文件,寻找一个尺寸相差最小的空挡,写到里面。如果找不到,追加到data section末尾,这时data section扩大了,原有的info section被破坏:)。别忘了跟新内存里的info section和空挡列表。
7、最后,写入info section和tail section。
8、删除info seciont备份!

***总结和思考***

·这是一种简单而实用的包机制,支持跟新,磁盘空间浪费很少。
·这个机制经过实战检验。
·初始时,文件块会按照路径排序,多次跟新后顺序多少有点乱,因为这个机制是见缝插针。但不知道这个会有什么影响。应该影响不大。

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
 楼主| 发表于 2010-7-28 12:54:00 | 显示全部楼层

Re:一个简单实用的资源包机制

生平第一次帖子被加精!

16

主题

154

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2010-7-28 13:28:00 | 显示全部楼层

Re:一个简单实用的资源包机制

看看.

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
 楼主| 发表于 2010-7-30 21:28:00 | 显示全部楼层

Re:一个简单实用的资源包机制

我的同事测试过,读取许多小文件比读取一个大文件慢得多。

12

主题

78

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2010-8-5 14:40:00 | 显示全部楼层

Re: Re:一个简单实用的资源包机制

niexuchina: Re:一个简单实用的资源包机制

我的同事测试过,读取许多小文件比读取一个大文件慢得多。


顶。

0

主题

54

帖子

56

积分

注册会员

Rank: 2

积分
56
QQ
发表于 2010-10-7 09:23:00 | 显示全部楼层

Re:一个简单实用的资源包机制

收下了!

0

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2010-10-7 12:13:00 | 显示全部楼层

Re:一个简单实用的资源包机制

哪里下载???

0

主题

51

帖子

51

积分

注册会员

Rank: 2

积分
51
发表于 2012-9-25 22:21:00 | 显示全部楼层

Re:一个简单实用的资源包机制

可以用于游戏资源的封装防别人盗取资源,但是现在好像普遍用的文件头在前头哦。。呵呵。。。

2

主题

79

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2012-11-3 09:12:00 | 显示全部楼层

Re:一个简单实用的资源包机制

总而言之,很好啊。

3

主题

81

帖子

209

积分

中级会员

Rank: 3Rank: 3

积分
209
QQ
发表于 2012-11-6 18:21:00 | 显示全部楼层

Re:一个简单实用的资源包机制

学习了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-27 12:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表