数学建模社区-数学中国

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

作者: xShandow    时间: 2004-12-7 14:01
标题: [转帖]游戏中的资源打包技术
<TABLE>% q: c+ D. ]4 M8 \

$ m% V# b6 J& A2 L6 Y<TR>2 F8 E* i$ {1 J* g7 M. H
<TD width="100%">
8 m, R" R* r+ e+ q2 C< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>; N7 V, f. m8 `' Z
<TR>( |: v# Z$ ?  t, r$ q+ Z% \& K3 H
<TD width="100%"> </TD></TR>
. b# `4 W' K/ B+ R# N) h/ V# L8 }<TR>
! ?/ g) o% c' h0 q" C. p<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
3 e. o; o0 b! L% R4 K$ `0 f </FONT> 0 z" x+ ?! j( U8 s+ u$ a9 q
< ><B><FONT size=2>1.安全性。</FONT></B></P>
# i" ?5 a* _3 P6 C< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。/ Z% d: y7 y- l( _* h- i3 Y
 </FONT></P>
. E2 v0 E, y. }( w6 G' E4 g9 L< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>" E! ~" \- W/ _4 a1 R* [) e3 F! ~
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。  l& Y5 N7 U- Q& I9 u& ^& a& r4 ~
 </FONT></P>
( s% A1 z, G& R0 }0 |< ><B><FONT size=2>3.美观</FONT></B></P>: P" B- G$ @; [/ T; B/ U2 f' I
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
& u2 ^2 u3 _% }) s0 g- c </FONT></P>4 U8 V; E1 T$ W0 L
< ><FONT size=2>4.还没想到......</FONT></P>
/ z1 e2 u, Z  {: K, J5 g< ><FONT size=2> </FONT></P>$ @4 [' }3 Y1 \
< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
5 v' L% @. i+ T; m' y< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>2 L. R" l8 p$ _, o" _
< ><FONT size=2>我想到的有以下几种结构:% Z! z3 H7 q, C1 K; d9 ?( x
 </FONT></P>
+ a/ U6 `1 ]1 K! c& K/ L3 ^< ><FONT size=2>1.</FONT></P>
% D  ~+ y5 e3 ]( h9 b8 g0 F< ><FONT size=2>{</FONT></P>+ r' ]* X4 s; ^3 S' T
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>
3 i4 S. q5 ?  o1 t; Z< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>4 y5 p" R# u  p) @" g9 k" _
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
2 b. s, N+ Z2 V3 P4 l) J< ><FONT size=2>    各个文件内容</FONT></P>. w% s& k& b4 N4 X
< ><FONT size=2>}
/ u2 }9 O/ A8 ?* M# p </FONT></P>
! E" R# R) a0 F1 R2 u4 a& U< ><FONT size=2>2.</FONT></P>
8 x3 `/ B7 K4 W$ [9 f' S< ><FONT size=2>{</FONT></P>
; o, _4 b) i8 \& i8 D< ><FONT size=2>    文件标示信息</FONT></P>
" E5 Q5 o1 C, e% R) S9 y' x< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
4 y9 `8 M) n9 I/ h: J' T" f3 w. L" D< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>( o3 ]' S0 H) l4 i3 K2 L. E! n( h4 @: P. l
< ><FONT size=2>    ......</FONT></P>
; \5 r: y" c( b4 k4 C; p1 J# Q' g< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
% x; T0 m1 B# Y0 t) T8 z< ><FONT size=2>    (文件计数)</FONT></P>
7 q: G% G) B9 |9 b0 T% M. I< ><FONT size=2>}
, w2 t* @$ @* C( O# I9 s </FONT></P>" L4 O* C, Z# T3 D9 F6 [
< ><FONT size=2>3.</FONT></P>0 R" ^/ J' q( k: g) w
< ><FONT size=2>{</FONT></P>
' h! c6 x! w% Y5 x1 B1 E% d<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>0 H& b3 ~2 q' p
<P ><FONT size=2>}</FONT></P>
/ X3 f7 f: z+ G1 o& p<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
* v) c5 I9 Z: {8 [( e( `<P ><FONT size=2> </FONT></P>
- F* |: r) p$ }  c<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>; J; {4 L0 u) Q3 F) ]& w3 [
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
) H% b9 k0 L( b$ K; U! q<P ><FONT size=2> </FONT></P>
# Z0 |4 p+ J% T6 n<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>. E  V  x6 k2 C& D5 ]
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
# A6 F# \) Y% I+ \& n! L<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)! T% A. p* p& C0 E, k8 ]0 \2 d7 N
 </FONT></P>& Y6 y$ m3 [* l5 ?# h
<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构/ {" G# i) m$ Y! t
 </FONT></P>4 s5 d4 |( `( }) T6 _0 d
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>
2 j0 A/ k$ G# @3 U<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>  j8 \6 m. K8 i" H" d+ N) }
<P ><FONT size=2>    {</FONT></P>2 g1 B7 R' N; j
<P ><FONT size=2>    #ifndef PACKER</FONT></P>
% b9 @, a4 V' T  u% g1 z$ h* Z& S<P ><FONT size=2>        strcpy(y,x);</FONT></P>
8 ^4 `. ~+ o3 Y& \2 V8 A2 h<P ><FONT size=2>        return true;</FONT></P>0 l, y8 q$ n/ r% q3 l' O! k3 \
<P ><FONT size=2>    #else</FONT></P>
* m: J, [7 @+ y7 ~, d' f  a<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
0 q1 r3 x2 w! r; T  \<P ><FONT size=2>        否则,返回false</FONT></P>
" `9 Q& ^; b9 {( i' C$ h<P ><FONT size=2>    #endif</FONT></P>
% A3 }4 I# T- P  `& v<P ><FONT size=2>    }0 V) U* r7 L: I: m) v8 \
 </FONT></P></FONT>; r8 c* b% a) U4 Z
<P ><FONT face=Arial size=2>  程序中应该有如下片断/ I4 A8 ~& d" E0 X, N* y
 </FONT></P><FONT face=宋体>" C1 F. G0 F* J! c6 \) D! b
<P ><FONT size=2>    char szFile[256];</FONT></P># q: g  c; g$ M! Z, q- x3 l8 K
<P ><FONT size=2>    CPackFile packer;</FONT></P>9 l+ D% ]$ F4 V
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
0 b6 m. _* G% ^! J4 t<P ><FONT size=2>    ................</FONT></P>
4 ?# N6 p$ l. K% w% ~<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>' A1 F; `9 l3 J
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>2 Q0 s) a: `/ _; _1 V/ Q" Q& A
<P ><FONT size=2>    </FONT></P>( q7 t: C1 `0 B) n
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
1 O; H( z; \. y; Q6 E<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
8 X* c2 s. B! i<P ><FONT size=2>  欢迎和我交流</FONT></P>
$ }- U2 t" g* b2 q( c<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>/ q9 D3 Y- \" L0 f9 s
<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>
9 Z) B- @# S5 {+ E<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