数学建模社区-数学中国

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

作者: xShandow    时间: 2004-12-7 14:01
标题: [转帖]游戏中的资源打包技术
<TABLE>* e( n' U8 P  K

( D( F, y) [/ L& q3 ?0 s<TR>
! X$ U1 Q+ \2 m( k  n<TD width="100%">3 s6 M: U- f4 M- L
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
, e# v. Q9 B4 f7 C$ r<TR>
% t3 f% ]' R' ?<TD width="100%"> </TD></TR>
" g0 h0 G. `3 b% g0 K<TR>
3 I# E0 _6 @$ B. P4 L: G8 g<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:$ Q$ ~8 _# H6 ?6 F3 y
 </FONT>
) K1 ^1 e" I! i( g% |" {< ><B><FONT size=2>1.安全性。</FONT></B></P>& Z; e% `- u5 C) r) ^; b
< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。* j* x: G8 ~, q/ \0 p/ ^2 ?$ j& ^
 </FONT></P>
4 J6 `3 A  @+ \% t6 e< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
; Q. @( ~3 B- i  p' c/ z/ Q2 X3 g< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
" S6 M2 h  ^, L% C; Q) e( v3 }9 h </FONT></P>
& I! i) G8 z, t+ w; k< ><B><FONT size=2>3.美观</FONT></B></P>7 g; q, v2 g7 h0 k( G/ [1 y
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
" U- `" V+ [+ L- D0 J </FONT></P>
% \. a- ~6 t" y$ O< ><FONT size=2>4.还没想到......</FONT></P>* f$ N! s* h* c
< ><FONT size=2> </FONT></P>9 z6 k3 b' r7 _; w6 Z2 y/ y5 Z
< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
+ S3 O+ |. g$ Z< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
  n/ r; K3 l) j4 L5 i< ><FONT size=2>我想到的有以下几种结构:
( M% N" z6 m' C) ]; l </FONT></P>
8 l- Z0 C. W& i" z$ K2 J- N$ x< ><FONT size=2>1.</FONT></P>8 _/ d( o( x8 J; k0 t$ s0 x
< ><FONT size=2>{</FONT></P>
4 U1 H6 @7 {# v* U" B< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>0 X( `0 `/ D2 N
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>
* k- H$ F$ Y& a< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>8 d; b0 ^% i2 O% g' Y) U1 @$ S, o
< ><FONT size=2>    各个文件内容</FONT></P>' b- Y( y- I5 ~2 c9 |
< ><FONT size=2>}
% y2 ?; s$ J* g6 R  f </FONT></P>$ ?5 R: m# F* x; Q& v9 ]
< ><FONT size=2>2.</FONT></P>- p7 t* D) f% w- g& e
< ><FONT size=2>{</FONT></P>
2 ]4 D0 K9 y: f8 S! Z" U< ><FONT size=2>    文件标示信息</FONT></P>2 v# d7 Y3 \: ^& z' J, C& A
< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>, n( p% }6 M, c
< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>2 g- ?! s+ ?9 [2 n* ^
< ><FONT size=2>    ......</FONT></P>' q5 a3 R2 d" l" P/ C
< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
% B5 {3 M5 g# q6 l, h< ><FONT size=2>    (文件计数)</FONT></P>- }7 J7 {; ]* ^+ F2 G
< ><FONT size=2>}
: C5 N; C; R3 l. ~ </FONT></P>3 L/ p+ k7 K; W
< ><FONT size=2>3.</FONT></P>- j. D3 S: b7 X( G8 A; _
< ><FONT size=2>{</FONT></P>/ H9 C6 t" U8 D
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
8 h) C& q0 Y" \" ~9 w/ }$ Z( ~# X<P ><FONT size=2>}</FONT></P>
& L5 n* O6 I8 w( ?% [9 ?<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>  Q( }0 j1 ?2 h9 s- U4 o" Z
<P ><FONT size=2> </FONT></P>
& {+ u$ H& d. J- p; T- F<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
, i. O  c1 F2 m$ i: k- A<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
' B% |# D& G0 I<P ><FONT size=2> </FONT></P>3 n: ~# G) ?# a, E" ~- t! X0 H
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>
0 i( }3 K4 ~) D  v<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
! C: d% ?- v6 V4 s$ K<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)2 X9 `& M/ ^% F$ ?
 </FONT></P>
- n: V0 _- K8 s& V! y* `% @! r<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构' W% Z6 j6 D6 {7 M$ U
 </FONT></P>
3 U- t0 m  I9 K<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>
  }1 W& d) y, w' K- K2 H<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
) y$ v, U5 d( j- \' N7 D<P ><FONT size=2>    {</FONT></P>
" H; b7 h& `# b, w* K6 L<P ><FONT size=2>    #ifndef PACKER</FONT></P>
! k: c6 V. Y# o! s1 \<P ><FONT size=2>        strcpy(y,x);</FONT></P>
0 ^6 N1 [5 ^7 X! S0 g% ?( i* H<P ><FONT size=2>        return true;</FONT></P>
& @' C2 N/ E0 B; F. _<P ><FONT size=2>    #else</FONT></P>
# N! w$ u2 ]$ N<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>* S( r- y" J$ d6 U
<P ><FONT size=2>        否则,返回false</FONT></P>' H& {/ c& j! x3 g$ K; w% h
<P ><FONT size=2>    #endif</FONT></P>& Y( i5 S: \1 Z( D, z3 s5 c
<P ><FONT size=2>    }; K9 Z2 Q4 Q2 ^+ }+ I, l
 </FONT></P></FONT>" K6 a: P( B2 p
<P ><FONT face=Arial size=2>  程序中应该有如下片断3 l+ G$ a4 K9 j# R
 </FONT></P><FONT face=宋体>6 Y: D& ]! P( U
<P ><FONT size=2>    char szFile[256];</FONT></P>
6 P' n. o* H* t9 o/ ?<P ><FONT size=2>    CPackFile packer;</FONT></P>" Z' [! N+ V4 B( ~4 h
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
8 k& T' @5 |, x% p9 C/ `9 u  _<P ><FONT size=2>    ................</FONT></P>+ ]3 y2 e# {: L1 V
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
! w3 @, o# U8 C! k/ j7 O<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>1 x/ ~4 K( i. R
<P ><FONT size=2>    </FONT></P>- Q* t6 w2 j. [6 c8 J3 A
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
# c1 U2 p7 n2 l& H% r<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>6 w% S3 J/ Y. u% d6 o0 r6 i' ?
<P ><FONT size=2>  欢迎和我交流</FONT></P>2 Q( ]' X( C- @& Y0 Y" \; s
<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
) h1 ~5 f, l% n" Q: _7 ^<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>$ e1 d) k- I) b6 I2 n! U
<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