数学建模社区-数学中国

标题: [转帖]游戏中的资源打包技术 [打印本页]

作者: xShandow    时间: 2004-12-7 14:01
标题: [转帖]游戏中的资源打包技术
<TABLE>; J6 X( a7 Y* r
3 f$ V" k' K; C) c1 A
<TR>9 s% g6 M" j+ d4 }3 O% b" j) v
<TD width="100%">, `* L) p  \1 m2 p4 \. g) I
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
$ O9 C4 ~; V$ n; A2 m<TR>. d1 A# X/ F8 F  x
<TD width="100%"> </TD></TR>
* U7 b2 L3 H* ^) s/ S8 O4 m2 s<TR>
9 \8 z9 T' o- k* A<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:6 ~0 b# g: P" i. Q! I1 d3 `' o5 K
 </FONT>   a3 k4 W- J3 }" ~
< ><B><FONT size=2>1.安全性。</FONT></B></P>
' o1 I: p+ R. g3 z8 c; I/ h: L, k< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。9 h& a9 C, f0 ^0 r" d7 [; F2 X) q
 </FONT></P>2 B/ |6 h& C) H2 u! ^
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>% o* ?# X" Y. ^) L, w
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。. `& z! y$ n! h- S% e0 f! n; ~
 </FONT></P>- X$ V: k0 y6 p/ n
< ><B><FONT size=2>3.美观</FONT></B></P>1 Q# D/ N0 Z" ?: f  o' h# U- R( K1 a
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。2 _$ e* [4 D. F) ^
 </FONT></P>* g( U. n3 A3 \) v3 _
< ><FONT size=2>4.还没想到......</FONT></P>( O' o) _" R+ ]
< ><FONT size=2> </FONT></P>
2 V' b* A$ {0 l9 |$ ?< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
. l, P* C, s$ F! s$ M< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
& q, L6 Y* c" N3 ~( o1 ~< ><FONT size=2>我想到的有以下几种结构:" K* v- M6 w- L: H: P+ i
 </FONT></P>
* b/ l( n/ I. j7 }2 R$ e: T< ><FONT size=2>1.</FONT></P>- G9 ]: s, z# d6 N
< ><FONT size=2>{</FONT></P>
5 |/ f: i+ f' O* x< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>
2 i, W4 p2 ~* d% V< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>
. V/ p* v) Q0 o: U6 R< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
  I, Y  n8 R: q< ><FONT size=2>    各个文件内容</FONT></P>, s: e: W+ |' I' X1 i' m
< ><FONT size=2>}
7 R! d8 q- b$ N0 z) Z </FONT></P>
6 u) U* j' _3 v- o& ?- K5 ?+ M% D< ><FONT size=2>2.</FONT></P>- e. z1 l5 Q6 J5 @- P7 P! @. @
< ><FONT size=2>{</FONT></P>
. E2 T# P- l- F- h< ><FONT size=2>    文件标示信息</FONT></P>
, k/ S6 {$ _) Y& x0 a< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
; z9 X) q! t6 d' w8 Z< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>% r$ P( T& ^/ U; j' e
< ><FONT size=2>    ......</FONT></P>; d( k* F0 W  o0 W8 u& b
< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>. Y. ]  }  g4 G3 q
< ><FONT size=2>    (文件计数)</FONT></P>5 r+ G# ]1 H; a/ J2 I
< ><FONT size=2>}: F# Q* P6 {* T3 Y# g
 </FONT></P>
7 L# i0 s" B7 y0 w< ><FONT size=2>3.</FONT></P>7 V. ^! J- q& w/ X) H. k. t
< ><FONT size=2>{</FONT></P>
5 m' J3 D9 i! E3 Y" q/ B( g<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>9 W0 r% Y! q6 N) H  f$ C) v% S
<P ><FONT size=2>}</FONT></P>1 p9 `& C" W; M$ |, p
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
6 I1 [+ h! I# B6 t6 C, R. l<P ><FONT size=2> </FONT></P>
2 E( M$ G# c/ M% _<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>  U9 A$ T7 y+ q& O0 ]5 N# c
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
0 j. M$ O) U; s9 ^<P ><FONT size=2> </FONT></P># W- J7 }8 N" A; J1 C/ j: j' b: ~
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>5 {1 l/ Q3 y3 d4 W
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>% H: c1 ^# c; I* Z! X2 g
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)6 r9 D4 a: W- K: J, b
 </FONT></P>
2 Y. F% J8 ?5 M$ b; t5 [& S<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构: x9 \" S: K; z* X. v/ y# u$ Z/ O
 </FONT></P>  Y* d7 o; t) T1 D2 d
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>$ W) A+ d+ Z. G6 V7 P& O
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
! l) R5 Q# B" ]; ^<P ><FONT size=2>    {</FONT></P>
4 i& }: M3 T2 y- U) f+ b! G<P ><FONT size=2>    #ifndef PACKER</FONT></P>+ L, a  ^! K* y# d  C0 w/ z
<P ><FONT size=2>        strcpy(y,x);</FONT></P>
1 C; B1 U5 C) t" ?6 A3 I9 P1 G<P ><FONT size=2>        return true;</FONT></P>. n8 |8 M& C% q7 R! u* ]7 q
<P ><FONT size=2>    #else</FONT></P>' a, k0 \5 Q  J' D. S
<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>" X4 r4 t7 y2 |' ^
<P ><FONT size=2>        否则,返回false</FONT></P>
: e1 m* P1 Q; @" i5 I<P ><FONT size=2>    #endif</FONT></P>: B# Z0 H( U# V5 x$ j
<P ><FONT size=2>    }3 s/ Y. y% ~" ~+ w# \* |: w
 </FONT></P></FONT>" f( e# K4 N/ r5 f8 r7 }$ `3 w
<P ><FONT face=Arial size=2>  程序中应该有如下片断- z0 ]0 q9 k6 [2 p8 w) a. b% f9 ?$ D
 </FONT></P><FONT face=宋体>
6 Z  r$ ]' \+ z2 v<P ><FONT size=2>    char szFile[256];</FONT></P>; n! g+ t+ S, z( P  r
<P ><FONT size=2>    CPackFile packer;</FONT></P>7 v' r' X7 M* p
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>6 ?9 G8 ], z3 }0 D6 G: }" `" ?5 f
<P ><FONT size=2>    ................</FONT></P>
, Q# m& r$ g# J2 }3 e8 L! b<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>$ t. T! s- ~: ~. b+ I* f
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
/ p+ L7 y& [4 b$ C7 X- G$ y<P ><FONT size=2>    </FONT></P>$ [, X" E; H- q4 e9 x
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
* L9 ]# ]& h% `: B<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
# i! A2 O' I2 P1 k' O<P ><FONT size=2>  欢迎和我交流</FONT></P>4 R* ~9 i3 e% H' ~
<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>$ F7 n) U* ?: `4 k: m1 Q8 @
<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>! ^6 e9 @; U4 K  G# z; q
<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>
作者: ppooiiuu    时间: 2005-2-13 12:46
kl




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5