设为首页收藏本站官方微博

【汉化资料】【转贴】游戏中的资源打包技术

[复制链接]
查看: 1547|回复: 0
打印 上一主题 下一主题

【汉化资料】【转贴】游戏中的资源打包技术

跳转到指定楼层
楼主
发表于 2008-10-28 23:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【汉化资料】【转贴】游戏中的资源打包技术

打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。# u) N4 j1 p. P. Z4 |6 U
那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
8 K! R: p! c  ]* p, G- Y% t   1.安全性。
' Y8 S; G7 r& b1 J5 v8 H   如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
% L' ~/ [9 W$ A. `   2.节约磁盘空间。
  R' m5 f1 K7 S9 k9 N   文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
- B( r$ T2 g) G5 g1 U   3.美观4 Q" h1 Z! B& M/ d) x
  简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。6 {/ A$ l. f# ^
  4.还没想到......
+ C3 `, _8 I4 A: i" R3 E/ X  下面说说我的设计思路。
& T# A- c/ h' m! P. z   打包后的文件该是怎样一种结构呢?, t/ K/ I# Q7 v$ g; H  ?6 C7 `8 @
  我想到的有以下几种结构:+ k6 E% z/ S  J4 {. Z6 b* @+ u
  1.   { 文件标示信息 //判断是否是正确的打包文件 文件的个数,文件索引表大小 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小. 各个文件内容   }
- l0 W! x) o& w6 B7 \, k0 A1 r3 Z  2.   { 文件标示信息 第一个文件信息: 文件名长度,文件名,文件长度 第二个文件信息: 文件名长度,文件名,文件长度 ...... 第n个文件信息: 文件名长度,文件名,文件长度 (文件计数)   }
# m$ y- K; S" P7 l/ k: s   3.   { 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容   }   这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点. 5 L8 o" f1 |0 |) B3 W/ g4 \9 K
  需要压缩么?! ^$ |7 K: a8 i9 Y( x
  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.   怎样在游戏中从已经打包了的文件读取需要的文件?
7 t- V8 t* g, T9 s. s, t) I* s+ W7 t   最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可, ) n0 c9 b# {3 k  o) K
  游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)   在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
5 F( W. ~2 H% x   //假设这个是一个打包类的一个成员函数, 8 {2 ?1 i/ W6 g+ ^7 u% `
BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile) { #ifndef PACKER strcpy(y,x); return true; #else
( w5 N# {0 q0 Y8 |; R; }" c9 ~" N  在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true
& B# R0 e2 S  N# d7 y0 h8 ^# N+ A  否则,返回false #endif } 3 L% H( [3 _) _7 K, ?
  程序中应该有如下片断 char szFile[256]; CPackFile packer; packer.OpenPackFile("somefile.pak"); ................ if(packer.GetPackFileFromPacker("resource.bmp",szFile)) do something....   
5 w5 p7 t/ O$ p- a$ \1 K" j下面看看我的具体程序吧!: M0 \! k. s' f  R7 T0 [+ |& L$ X
1 L, Q- y/ ]# n1 j, u1 v0 F. M
欢迎和我交流   E-mail:[email protected]   OICQ:30784290(难得糊涂)   http://GamePlusPlus.yeah.net
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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