冒险解谜游戏中文网 ChinaAVG
标题:
【汉化资料】【转贴】游戏中的资源打包技术
[打印本页]
作者:
shane007
时间:
2008-10-28 23:12
标题:
【汉化资料】【转贴】游戏中的资源打包技术
打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。
/ W7 ^2 n4 t) L/ t, U; ~+ _
那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
/ J$ r! G Y6 t0 t3 J3 Z
1.安全性。
' N0 R5 c# i. L5 R& {3 x
如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
* u3 h" h- _# ]% G# x* ^
2.节约磁盘空间。
+ s) Q- @$ Y2 t6 D3 V
文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
+ `+ S( w7 U0 K
3.美观
: r! H/ x3 n- Q1 E; k& J$ c h
简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
0 O; ^6 |5 S$ t! h: o+ h/ z
4.还没想到......
: i4 r1 Z0 U5 L8 d- O
下面说说我的设计思路。
4 Y& m( i' d/ ~! X
打包后的文件该是怎样一种结构呢?
' K! U( N! Z% r
我想到的有以下几种结构:
- j+ h3 K5 r) V
1. { 文件标示信息 //判断是否是正确的打包文件 文件的个数,文件索引表大小 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小. 各个文件内容 }
/ Q$ ?, B. c6 S: n' ]$ S( ]
2. { 文件标示信息 第一个文件信息: 文件名长度,文件名,文件长度 第二个文件信息: 文件名长度,文件名,文件长度 ...... 第n个文件信息: 文件名长度,文件名,文件长度 (文件计数) }
0 |. ?* H3 ^4 z w6 W
3. { 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容 } 这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.
& G( f; V( [5 Z( Q9 y+ F
需要压缩么?
: d+ J" K6 M# H
解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩. 怎样在游戏中从已经打包了的文件读取需要的文件?
4 J+ l: w3 a' C2 u2 [
最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,
" X' W0 Q/ X0 b ]: E
游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之) 在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
; Y% O# n2 ]6 x5 S% f
//假设这个是一个打包类的一个成员函数,
* K5 P% }# b, a
BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile) { #ifndef PACKER strcpy(y,x); return true; #else
, S7 [- [3 k) H% i% n+ B* t2 e2 w
在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true
, i+ `1 }* w- m6 ^$ G% k
否则,返回false #endif }
3 k6 V* S% j+ J5 X: |
程序中应该有如下片断 char szFile[256]; CPackFile packer; packer.OpenPackFile("somefile.pak"); ................ if(packer.GetPackFileFromPacker("resource.bmp",szFile)) do something....
" K* n( P+ f9 B- L8 h3 c
下面看看我的具体程序吧!
8 E2 R- @* y" v; X) z- ^$ B
& M; J/ f( o/ }/ Z1 ^' Q' Y
欢迎和我交流 E-mail:
[email protected]
OICQ:30784290(难得糊涂)
http://GamePlusPlus.yeah.net
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2