QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE># U1 u# y. o) |! C* a

9 G* k* h6 N. E" v! N1 E: U/ K<TR>2 w3 l' q) f( c
<TD width="100%">& C. T2 a8 k* ^5 a  ^: B
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>/ h$ L1 c. T& o. B
<TR>( ^+ A3 M0 D( J0 q3 z7 e% I/ Z. @  [
<TD width="100%"> </TD></TR>6 j+ ~# f3 N7 h) n5 h
<TR>& T& B8 W- \0 v1 P' M1 q6 y
<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:  W/ G# w" _4 T1 Z+ t" F$ Y  V/ V2 w
 </FONT>
# F. ?, X& C# D) q( d8 }8 r# Q! u< ><B><FONT size=2>1.安全性。</FONT></B></P>
1 n$ Y! [% O( y9 V) |( |. r< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。) i4 i6 d- y! h
 </FONT></P>
8 U( q2 {3 s) c  t  Z* ]$ f5 d< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
$ }/ y, P( J" i- c" i4 N< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。8 ]3 E3 Y  D' H: a* Z
 </FONT></P>  }3 Y1 I; G$ @! |5 t- D8 S
< ><B><FONT size=2>3.美观</FONT></B></P>8 M( |. j& [( F9 T5 D: `" a6 M6 R
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
7 [9 X% g" n/ c% m$ x% _ </FONT></P>
) ^  i  [8 O1 C5 ~2 Q! K, r" E< ><FONT size=2>4.还没想到......</FONT></P>
3 T) d  F, d# t% s& P7 W8 ~  x& c< ><FONT size=2> </FONT></P>* X0 e  T7 F$ Q( @) a6 L
< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P># X* A) C7 e  Z) j1 W. k# O8 A$ d
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
$ M5 X% n& @9 L! G< ><FONT size=2>我想到的有以下几种结构:) `" y9 ~3 N0 m7 E1 B1 {
 </FONT></P>
+ m1 R$ }0 I* i  D( @& a: B< ><FONT size=2>1.</FONT></P>
  P( l/ k- F! {# o+ H< ><FONT size=2>{</FONT></P>
+ `- W5 {& I/ G+ z7 ~% n" W< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>
- I% C/ K0 S! w6 Y4 u< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>
, e5 p+ F# H. Y1 z( R. w3 e< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>8 o' D" C8 ]$ N
< ><FONT size=2>    各个文件内容</FONT></P>& o( a( c0 v% X  o! Y: F8 {
< ><FONT size=2>}$ y4 @8 ?) N! T+ ^
 </FONT></P>/ ]* t, O4 {( S0 Y0 n& D! x) i# j
< ><FONT size=2>2.</FONT></P>0 W4 z# ^* j+ x5 P
< ><FONT size=2>{</FONT></P>6 _7 Y) v% i4 b# o
< ><FONT size=2>    文件标示信息</FONT></P>: D1 @3 m9 ^6 p: `3 U
< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
) j6 W. R  X* d- X8 D( W< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>+ X1 a. z3 w$ o6 s
< ><FONT size=2>    ......</FONT></P>
  J5 h1 Y. o" J- N5 e< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>3 D! W- {6 I' K* Q3 V9 Z
< ><FONT size=2>    (文件计数)</FONT></P>
3 T' X# y/ B: e) }/ Q< ><FONT size=2>}
" f* X% [" e2 L2 P& J </FONT></P>' c  t) |0 w! P: x) j' K# F
< ><FONT size=2>3.</FONT></P>' V5 O: t$ E/ r
< ><FONT size=2>{</FONT></P>: }0 Q4 n0 c" R. N  t: L  L7 V7 b
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>% N1 x0 J; N) X/ l# c! w
<P ><FONT size=2>}</FONT></P>/ V- ^* F8 o2 ^$ a# p4 c9 T
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>" y% `3 r6 I  K# O! v6 B2 A2 ^8 B
<P ><FONT size=2> </FONT></P>6 \, U- z- f9 S& M  D/ q. Z
<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>5 p+ M. f0 l6 n, h- H- S
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>5 C, d: d+ O: C) ]5 A6 K, W) a  Q
<P ><FONT size=2> </FONT></P>$ P' J. `3 t- ^9 y+ y
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>4 A2 [, Z0 a+ Q# o, w, e; _4 U
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
" p& f0 E6 U  c/ H<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)# d! ^) I& c; H/ d% }% c
 </FONT></P>1 ?: H: {; ]5 a7 I- ^: e
<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
" x1 u* t7 t, v) P: g1 h </FONT></P>
* D$ V- n: s; ~# e<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>
; A. a5 o6 r) R- v6 Z# f0 s/ Q<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>" C8 d/ ^: K* \
<P ><FONT size=2>    {</FONT></P>8 c- O! g9 M, t. m- N6 _  D" B& Z7 R
<P ><FONT size=2>    #ifndef PACKER</FONT></P>' i1 S/ R" m: ^# Z( m# A6 \7 E
<P ><FONT size=2>        strcpy(y,x);</FONT></P>- A# T+ V4 h4 L* T
<P ><FONT size=2>        return true;</FONT></P>2 P2 R4 l& P4 |
<P ><FONT size=2>    #else</FONT></P>
8 p3 x6 |5 b5 k5 w& q- o<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
1 P6 q8 `& X* o2 c<P ><FONT size=2>        否则,返回false</FONT></P>$ X5 e" Y& M& ~4 t" {
<P ><FONT size=2>    #endif</FONT></P>7 q& f: h+ D' f- s& [
<P ><FONT size=2>    }5 l( e0 `6 g: k  r+ |7 F
 </FONT></P></FONT>
" `. k7 i8 f1 c<P ><FONT face=Arial size=2>  程序中应该有如下片断( R) K$ W! F/ `) L/ ~) M2 `
 </FONT></P><FONT face=宋体>% A" k" j4 Q$ X5 ?: j0 [
<P ><FONT size=2>    char szFile[256];</FONT></P>
4 ?, y+ W9 F% _& b- f  A) z5 I<P ><FONT size=2>    CPackFile packer;</FONT></P>5 r" P( ?; m4 l0 @
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>7 e, _6 h& l; `# o) g' I4 z
<P ><FONT size=2>    ................</FONT></P>! e3 d: @1 A7 ~
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
2 @) t+ M0 ]; v1 M<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
; t+ C: P& \5 W( b8 M/ \/ p4 C<P ><FONT size=2>    </FONT></P>
* s* H8 v, V* [<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
1 ]4 E8 _+ }1 U  e' C0 f  [& k<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P># n" u: z* P# k7 [0 Y
<P ><FONT size=2>  欢迎和我交流</FONT></P>
1 p$ Z+ O+ L( v* n: k, w<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
" e& `3 A; L+ X* W. O! x" J5 z<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>/ |9 D& `+ R- ^* u1 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>
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-7-21 05:13 , Processed in 0.512984 second(s), 58 queries .

回顶部