游戏资源打包问题!压缩、访问!

晓衡的成长日记 2010-07-03 02:38:10
最近工作需要在做游戏资源打包方面的东西。之前以为做的是像一个rar一样的将目录打包压缩、解压的东西,后来提出需求是在开发时是直接使用stl标准流读取文件,在发布的时候文件访问操作不变,但是资源文件是从打包文件中访问。
刚开始简单进行了设计,将目录打包和解包都做了,但没压缩文件。
数据包大概分为三部分:

|---头部---|---文件索引---|---文件数据---|

1.头部: 主要是记录文件个数索引区长度、文件数据区长度等信息
2.索引: 部分是连接的结构体数组存放的是文件名、长度和文件的偏移位置
3.数据: 文件真实数据,暂时没有压缩加密操作。

使用Boost::iostreas库做了一个文件在上面包上的访问接口,可以直接使用std::istream接口来访问包中的子文件。
大概接口: CPacketStream packetStream("d:/packet.data"); //打开包文件
std::istream* f = packetStream("test.file"); //打开包中的子文件,返回一个istream的只读流
if (f)
{
f->read(); //读操作
f->seekg(); //seek操作都可以
}

现在的问题是,要在包上做压缩操作,一但压缩了seek操作就不是那么简单的了, 但访问接口不变,一时没有找到好方法...
想请问一下在这里的朋友们有没有做过这方面的,指点一下。
...全文
461 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzl_acg 2011-08-14
  • 打赏
  • 举报
回复
网上搜下暴雪 mpq file怎么做的吧

还有现成的数据可以测试

我觉得包不要压缩,而是数据压缩比较好

index
data(compressed)

到时候把压缩过的数据读到内存解包就行了,mpq基本就是这么干的
weixiaohua 2011-08-12
  • 打赏
  • 举报
回复
根据索引读取压缩后的数据,然后解压就可以了.这个很简单吧...
ownsun 2011-08-09
  • 打赏
  • 举报
回复
读取大的文件推荐使用FileMapView技术,网上有很多这些的介绍
hualangx1 2011-08-08
  • 打赏
  • 举报
回复
不错,学习学习
soilwork 2010-07-04
  • 打赏
  • 举报
回复
现在的问题是,要在包上做压缩操作,一但压缩了seek操作就不是那么简单的了
------------------------
不要直接压缩整个包,分别压缩每个文件,最后合成一个包
解压也是一样,读出单个文件的stream,然后解

packageStream
foreach file in package
packageStream += Compress(file);
save packageStream to file
xychzh 2010-07-04
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教
  • 打赏
  • 举报
回复
谢谢楼上的朋友的回答。
就是说在真正读取或都seek的时候,是在解压数据上操作的,我当初也这么想。那是不是只是需要文件中的小部分数据,比如说在一个100M上的文件上(是包中的一个子文件),只读取其中很小数据或只是做seek操作时时也需要把整个文件解压出来。
引力场变动源 2010-07-03
  • 打赏
  • 举报
回复
一般读取的时候会先解压缩到一块内存中的,所以seek的是解压缩以后的数据——你要读取数据的话,总得先把数据解压,所以解压到内存中的这个操作一般不算是额外的性能开销。
ahhshan 2010-07-03
  • 打赏
  • 举报
回复
友情up
love514425 2010-07-03
  • 打赏
  • 举报
回复
> 关注。
Aallonlin 2010-07-03
  • 打赏
  • 举报
回复
关注。。。。
gamemagic 2010-07-03
  • 打赏
  • 举报
回复
把压缩文件当作普通文件处理可能比较困难

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧