QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3902|回复: 1
打印 上一主题 下一主题

[转帖]游戏中的资源打包技术

[复制链接]
字体大小: 正常 放大
xShandow        

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>
3 v7 c! C* `) m4 c7 A# N5 b; B* `8 I  o7 I. z& g4 t
<TR>+ D- d* i0 g1 c0 D
<TD width="100%">8 P& Y( n3 R; v% p
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
. ?, M' G6 n- M3 L% A8 d3 s" t<TR>1 j8 q, {# f3 |. t8 z, L) v
<TD width="100%"> </TD></TR>' o  G3 B5 }, z
<TR>
- p, P6 Z/ W' I8 V0 C3 R; k<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
3 A& l! Y. J- L" Y </FONT>
  n4 ]; S3 L3 D8 {( u! Q< ><B><FONT size=2>1.安全性。</FONT></B></P>; i1 w. @$ ~0 {6 x6 ^
< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。6 w! }( y3 f1 O2 C$ I$ ^% j/ p
 </FONT></P>7 q9 @3 j! i$ s4 {$ N
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>9 R  z, C) L& X) x& e, Z
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。8 a1 g# z, {( g! _1 ^: G
 </FONT></P>
& R1 g2 X9 T& ]  P< ><B><FONT size=2>3.美观</FONT></B></P>% x) }& |- \! o9 v
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
% M) q; u$ Y: K0 e8 b </FONT></P>$ q1 D4 `0 i- y2 G3 h/ [
< ><FONT size=2>4.还没想到......</FONT></P>
" Z/ k5 d- x  s( A" }$ ^< ><FONT size=2> </FONT></P>
% t# ]& C3 [+ e9 t/ b8 ~" O+ \< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>; ]' t( C+ }& [/ ?
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>3 q- Q! B+ _5 p: a1 C
< ><FONT size=2>我想到的有以下几种结构:" l$ I, |: f" V$ _/ w' }
 </FONT></P>4 e9 c  z  @9 ], \
< ><FONT size=2>1.</FONT></P>
* n% B, j; r! q5 _< ><FONT size=2>{</FONT></P>2 x6 A: x0 M/ c+ }$ m! U5 k" Y
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>% b. [- t" |0 h9 {( x4 y
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>, h0 {+ c, p9 Y. P8 R' e3 x$ [6 b- w
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>* i$ B( V4 M5 M3 a
< ><FONT size=2>    各个文件内容</FONT></P>
1 i; j3 x$ z) e" a< ><FONT size=2>}
: C: o- w; a7 u6 |0 u5 Y/ J/ d </FONT></P>! g' ?/ _- [4 v
< ><FONT size=2>2.</FONT></P>: `  T2 [! f# ~6 G
< ><FONT size=2>{</FONT></P>! ^/ ?! K$ _+ ~' V3 P7 D
< ><FONT size=2>    文件标示信息</FONT></P>
" j+ ?% R( x. L: z& b< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
* e4 D* m, O$ s2 |< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>; E: s, x5 ^$ V& x7 w  w) o7 d9 r
< ><FONT size=2>    ......</FONT></P>
& `: ]: [9 S  b  x4 ?< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
0 V1 z- {/ e4 S8 z8 O! L< ><FONT size=2>    (文件计数)</FONT></P>! ]3 {4 f! \( m; O4 V9 r+ C
< ><FONT size=2>}$ Q+ N- |* ]6 z2 O$ v0 ~+ M7 c
 </FONT></P># s% N6 W: u4 l% j- G! j2 z
< ><FONT size=2>3.</FONT></P># o: Y, H( {- H! f+ i+ P
< ><FONT size=2>{</FONT></P>, Z' p/ C! e5 K, W* [4 t
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
& S" W, o8 ~7 q) H3 [( w/ d* g" l) T( T<P ><FONT size=2>}</FONT></P>
+ j; P# g2 g) ~! s5 x1 B7 P& L: @<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>; R% t, t$ E) d( ~% ^( f/ }3 l
<P ><FONT size=2> </FONT></P>
) N. o5 r* X$ V" W! `# o6 k<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>9 L1 K% o" M* u( C% @
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>! ~5 w% w! b% I
<P ><FONT size=2> </FONT></P>& {0 ~4 ?) h! z" L4 P& J3 p; o* s
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>
8 ~; g9 a. F2 q+ {<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>) F! a9 |& M' U$ ?( S1 O
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)
* T2 J% k& {$ `; ^: N </FONT></P>+ D8 w9 D- |. U# ^' s3 y
<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构  a) u! j( ^7 p& x! y. y( R
 </FONT></P>: k) w4 i8 U- e; a
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>& [9 d( h! h8 c# X3 d* f
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
. z# G; d/ k( \( Y% H3 s<P ><FONT size=2>    {</FONT></P>
. b/ g9 d! R& {* P5 Q2 Z<P ><FONT size=2>    #ifndef PACKER</FONT></P>" ]2 b8 g' g$ G; u! ]! M
<P ><FONT size=2>        strcpy(y,x);</FONT></P>
# C! q5 R( {" i* K" e! ?+ x3 J<P ><FONT size=2>        return true;</FONT></P>- o6 e0 j. y% j  D8 e5 o& ~
<P ><FONT size=2>    #else</FONT></P>/ C' L# T+ Q7 x6 @: Y2 Z  O
<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
: r( y/ x, Z2 V+ m* W<P ><FONT size=2>        否则,返回false</FONT></P>* b* t$ w8 v% t
<P ><FONT size=2>    #endif</FONT></P>4 X. y' m0 E% z# l7 h! ^! Z4 C
<P ><FONT size=2>    }
' q' P, Q( O& |" c2 ]# @& H; o </FONT></P></FONT>
& l' o. I9 V0 u2 t& g5 r) w<P ><FONT face=Arial size=2>  程序中应该有如下片断
' F  ?, ^% V' F3 P* N$ Z </FONT></P><FONT face=宋体>, S2 W6 I  M5 g/ t# j
<P ><FONT size=2>    char szFile[256];</FONT></P>5 X; R( l/ E0 v- A/ A: G
<P ><FONT size=2>    CPackFile packer;</FONT></P>
2 g  Z- O. ], V# s8 j/ A1 W<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
! c$ b2 y/ x! E<P ><FONT size=2>    ................</FONT></P>! I7 u* i/ k2 ]6 B* W
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>2 J; ]! C. y1 Y
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
* M- g5 p. Y6 }: o<P ><FONT size=2>    </FONT></P>& N0 y! f0 m1 Z- \6 j
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>1 G: d5 I: e& j) q: _9 n8 m& s; Z6 H
<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>( g6 j9 r$ ~* A9 K+ o7 ?7 w
<P ><FONT size=2>  欢迎和我交流</FONT></P>0 T, M7 i8 a  e/ ~
<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
6 g$ T$ D' _  H5 u$ t$ @  y<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>
4 }. s% x1 C; \0 W' U/ n( a: r2 h<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
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
ppooiiuu        

0

主题

2

听众

166

积分

升级  33%

该用户从未签到

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-23 05:41 , Processed in 0.956586 second(s), 57 queries .

回顶部