- 在线时间
- 0 小时
- 最后登录
- 2005-9-21
- 注册时间
- 2004-4-27
- 听众数
- 1
- 收听数
- 0
- 能力
- 0 分
- 体力
- 1027 点
- 威望
- 0 点
- 阅读权限
- 40
- 积分
- 385
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 153
- 主题
- 43
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   28.33% 该用户从未签到
国际赛参赛者
 |
<TABLE>
4 ^9 d2 Z; H5 n% ^" c6 m& w# \
, h- G4 I7 w8 q: O2 m# b<TR>, ?1 m6 U" o% q* m1 Y) k4 ~1 L
<TD width="100%">
3 c M* M3 r+ _ z3 G6 c% y< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
" b4 g4 {" {! D<TR>- ]. u1 o' }0 m1 Z* h
<TD width="100%"> </TD></TR>) ?" @- i& a0 D4 Y5 F- q8 z
<TR>
0 H0 v7 x$ Z q& y! q<TD width="100%"><FONT size=2> 打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:% C, k9 \, R; C3 R4 R
</FONT>
: F/ M4 |+ k) @! o- b< ><B><FONT size=2>1.安全性。</FONT></B></P>
5 P6 J( I6 r! S0 {9 D2 S< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
) W5 A# C4 V/ o </FONT></P>
& T. q/ y/ e1 @0 e! ~5 p0 u< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
5 W, B7 ^. d+ m5 v0 [4 [< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。# _, \/ d! T) k: u' n$ d
</FONT></P> @$ ]! d+ V* C9 X9 ?, B: X7 r
< ><B><FONT size=2>3.美观</FONT></B></P>0 g) V# H6 ?2 J: D) }( c
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。6 @, u7 W& x$ k* s
</FONT></P>1 n" a! L) A; d- [- }
< ><FONT size=2>4.还没想到......</FONT></P>: e- g4 i# w" j. A
< ><FONT size=2> </FONT></P>
3 ]( M3 U/ {/ K- i3 O< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>9 W+ i' {, ?8 q k9 I/ g9 ~# [
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>9 {. {( T. h( i% g! K
< ><FONT size=2>我想到的有以下几种结构:2 P6 j" d4 j: s& ?
</FONT></P>
* T. h0 b' a) ~" O) A" ]< ><FONT size=2>1.</FONT></P>$ E& h5 g$ [3 K' k) ~* \
< ><FONT size=2>{</FONT></P>
7 z" ?9 s$ _$ u< ><FONT size=2> 文件标示信息 //判断是否是正确的打包文件</FONT></P>
K" r5 i: U7 ^% z7 E% g8 f& X< ><FONT size=2> 文件的个数,文件索引表大小</FONT></P>
' c3 ^/ |, y* |< ><FONT size=2> 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
$ _8 @6 c2 i$ e7 I+ S< ><FONT size=2> 各个文件内容</FONT></P>: M/ p* z0 X3 j Q: z& F
< ><FONT size=2>}( `9 s* j& e% w2 u
</FONT></P>
0 m( l7 |4 I" E m' E< ><FONT size=2>2.</FONT></P>
4 a6 v0 `" U$ C7 S! i< ><FONT size=2>{</FONT></P>, X* Z7 J- [" ]- I! [ ~2 @
< ><FONT size=2> 文件标示信息</FONT></P>
* S5 p, Y8 a& O8 L1 f. x: h< ><FONT size=2> 第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
K# c `" S- _( M( o6 c/ u< ><FONT size=2> 第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>" k6 C1 K3 f1 Q& w% Z6 z! R& D
< ><FONT size=2> ......</FONT></P>
; l1 y+ D4 m: l# p9 G) S< ><FONT size=2> 第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>! Z' k r- \- b2 T* w+ C: v
< ><FONT size=2> (文件计数)</FONT></P>
: {8 ^( j2 m+ o3 M1 g3 O< ><FONT size=2>}; [: u; ~5 P: g
</FONT></P>
& d5 d. B% e& Z% Y/ d< ><FONT size=2>3.</FONT></P>
# d9 T; U6 J2 z% u& ^' B< ><FONT size=2>{</FONT></P>
4 {* u7 `7 l$ ]$ X<P ><FONT size=2> 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
4 g# |. m. `. W/ i8 d, r: T<P ><FONT size=2>}</FONT></P>2 z o! ?& }' O; I4 g; ]$ D
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>& S$ J. W& D: c1 u, ^7 n0 B# K
<P ><FONT size=2> </FONT></P>
7 x( q) }. ^+ \. T8 h& L- C# R<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>: Z4 f3 z$ ~) b g2 p: Y1 d. w
<P ><FONT size=2> 解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
: E* H! C) q p# |' |# S' u: `<P ><FONT size=2> </FONT></P>! p) ~+ v4 T' j3 b8 K& ?4 D) f$ v
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>5 D. Y) z6 ?' T
<P ><FONT size=2> 最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
) U" a1 g3 D' D/ D+ Y<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)
. p9 E M) p' w2 i- C </FONT></P>
+ X X9 l' I |5 @: t6 c<P ><FONT size=2> 在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构& }4 L9 ^6 |. J" F
</FONT></P>. y/ j; M' I2 F x/ q
<P ><FONT size=2> //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>/ r1 k; s5 n$ t# p' D3 f& w
<P ><FONT size=2> BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>+ | \/ a' W8 e8 ^, W9 z
<P ><FONT size=2> {</FONT></P>- Z' Q7 g+ W5 m
<P ><FONT size=2> #ifndef PACKER</FONT></P>4 A$ ?: P! T Y9 E6 T7 u9 F, k
<P ><FONT size=2> strcpy(y,x);</FONT></P>2 y4 o, f( C% n% ?% T; \
<P ><FONT size=2> return true;</FONT></P>
+ \3 Q% o9 R `5 T/ L! y/ T<P ><FONT size=2> #else</FONT></P>
( s: ~* D3 q3 z: e6 }0 U3 |<P ><FONT size=2> 在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
0 R8 K& E5 i: a" W, _ e/ l<P ><FONT size=2> 否则,返回false</FONT></P>
9 N* D3 j' [& Z9 U6 e1 B! b5 h: U<P ><FONT size=2> #endif</FONT></P>
- H- p6 a3 D0 C* l+ K, h: k<P ><FONT size=2> }
& L+ s, {! |, K8 I </FONT></P></FONT>5 V) ]; [, ]; ?4 q3 |3 i
<P ><FONT face=Arial size=2> 程序中应该有如下片断
f4 N" b# A$ ?8 a' r( q/ x </FONT></P><FONT face=宋体>
' M9 i+ c6 A5 w# D$ }/ L7 [<P ><FONT size=2> char szFile[256];</FONT></P>
0 @5 O- x3 U1 |1 N$ t<P ><FONT size=2> CPackFile packer;</FONT></P>2 v2 f# T. V* A& T% M
<P ><FONT size=2> packer.OpenPackFile("somefile.pak");</FONT></P>
0 {1 A% f8 W4 [$ E<P ><FONT size=2> ................</FONT></P>' `& T! C9 i$ ]4 V2 o
<P ><FONT size=2> if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
: I" x0 c3 u. a9 v* N<P ><FONT size=2> do something....</FONT></P></FONT><FONT face=Arial>1 [- d9 G1 i5 f( s& X- K
<P ><FONT size=2> </FONT></P>" j8 d% F! H5 C, ~
<P ><FONT size=2> 下面看看我的具体程序吧!</FONT></P>
( B1 l: `5 T, P T1 q3 c- I<P ><FONT size=2> <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
9 K, U$ q9 Q5 m* d) ^, @/ N<P ><FONT size=2> 欢迎和我交流</FONT></P>* W1 b0 m$ @. P) J7 u" i
<P ><FONT size=2> <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
9 a5 e. `: J6 J# |0 |' h<P ><FONT size=2> OICQ:30784290(难得糊涂)</FONT></P>
1 M6 v8 y+ k# R' F2 P6 f<P ><FONT size=2> </FONT><a href="http://gameplusplus.yeah.net/" target="_blank" ><FONT size=2>http://GamePlusPlus.yeah.net</FONT></A></P></FONT></TD></TR></TABLE> |
zan
|