QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<TABLE>' d; J" I$ s* c# x0 p. B% J2 e
5 ^) N, F; u, M: J2 Q
<TR>
# `) p/ V7 A% z9 T, f6 y4 s<TD width="100%">
1 C" h; @* M' k/ s- H< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>  m6 V0 l# B! P& {7 d7 b
<TR>
& W- u7 o. e- G' N<TD width="100%"> </TD></TR>- S6 U* k( j. H0 P/ \
<TR>
. a* O/ n9 {. ~) e2 u( T! D<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:* p# W8 Y" R! n0 U* L
 </FONT>
) l* Q( v3 Z+ g4 k< ><B><FONT size=2>1.安全性。</FONT></B></P>
# N& _& U4 \8 \$ r! x0 V( g; L< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。' X3 Q8 k. x* S
 </FONT></P>' z' v1 w3 @; S/ ]9 p
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>! n( N' A# |5 ~/ V5 c
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
9 H) H3 U  ~" [; J+ Z9 V </FONT></P>
" V/ v0 t7 }, `4 w* }; K0 |8 ?* Z0 U0 c< ><B><FONT size=2>3.美观</FONT></B></P>( G( L* ?* ?0 K, `1 d* A& K) o
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。6 w2 d" F4 {3 k+ n' N
 </FONT></P>
& X( \$ {. E! E$ A< ><FONT size=2>4.还没想到......</FONT></P>
" T/ s) |; {' b: i< ><FONT size=2> </FONT></P>+ k6 L2 f, B: p. o; Z0 L
< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
0 \2 T' A5 o# c0 K< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>3 `/ U/ {- y: E, w
< ><FONT size=2>我想到的有以下几种结构:
/ f" a. S5 c3 a7 C% }- T. F </FONT></P>
# r+ W# J* r- G+ g& R% a< ><FONT size=2>1.</FONT></P>
/ L  r  h  P+ A7 z2 f. [4 q< ><FONT size=2>{</FONT></P>- Y) w2 R  \/ L% j1 Y8 P
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>6 v8 a3 d% `# g/ {# n8 K
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>+ T" }' ]' F6 N2 v
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>3 ?  j) w& Z. A+ U5 a; N
< ><FONT size=2>    各个文件内容</FONT></P>
# ]9 K8 _/ R% p2 c5 m  G% o< ><FONT size=2>}5 ?, V8 P* l6 g
 </FONT></P>
2 {( G9 y/ C% f7 e. Q' B< ><FONT size=2>2.</FONT></P>
3 o+ Q5 D8 a: N! b6 U9 Q1 w< ><FONT size=2>{</FONT></P>, y3 Z4 M. L: R" }4 Y3 E
< ><FONT size=2>    文件标示信息</FONT></P>
- M+ `/ b) U9 u% S% ~< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
9 T- W& l7 Z  i: Z1 u< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
7 k' w4 }$ R1 c< ><FONT size=2>    ......</FONT></P>( R4 b( v: Q9 z( l# G8 q
< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
( F+ I0 j. U* O< ><FONT size=2>    (文件计数)</FONT></P>1 i8 F9 q+ t" V9 @1 V8 `
< ><FONT size=2>}
) P4 o/ `! N. ^; Y1 u& } </FONT></P>" c% f4 d# p. b2 C
< ><FONT size=2>3.</FONT></P>: z  g/ P/ L* l5 y. y, m: o
< ><FONT size=2>{</FONT></P>; ^1 }3 A! L3 D+ N% T
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
7 T4 E6 y* M1 B# S4 v<P ><FONT size=2>}</FONT></P>
7 b/ N8 }& `% t/ }5 b4 h<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>% I# ^" }& v. C. Z: \  o
<P ><FONT size=2> </FONT></P>
+ s- i- J3 ?" D; u6 J& F0 ~" _' y: K+ D<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
6 J: F) s! S( h, m0 R5 a<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>( ]0 t* e& Y' e& Q  X
<P ><FONT size=2> </FONT></P>
' }  R6 s0 W/ u<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>0 H. [) _% L' h# q* ~- s/ s
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
) y4 ~9 s6 e. w<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之); f, @3 F% ~5 v
 </FONT></P>
$ L7 P2 M' E3 E* G1 H6 m<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
3 D& X9 G! t  V( G& r </FONT></P>- x6 b0 u( B3 W7 r2 {
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>0 ^$ n! @# Y  t: k
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>3 y3 y' i4 Q. C
<P ><FONT size=2>    {</FONT></P>8 R8 h1 X  h7 s/ h7 o, L
<P ><FONT size=2>    #ifndef PACKER</FONT></P>
8 n7 z+ C" c& E  U7 V# ]% u5 N<P ><FONT size=2>        strcpy(y,x);</FONT></P>0 ^% G3 e5 o& M6 y% t
<P ><FONT size=2>        return true;</FONT></P>
% R2 V' l# D/ n5 _' ?. d- \8 P1 e<P ><FONT size=2>    #else</FONT></P>, e9 w: M: b6 h8 K: p
<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
% g1 M6 e2 K) \<P ><FONT size=2>        否则,返回false</FONT></P>; S+ l8 {4 ~9 X$ ?. q( q, ?& p! n, W- n
<P ><FONT size=2>    #endif</FONT></P>* ]  y  M8 m" L/ U4 u( G. P5 A
<P ><FONT size=2>    }- H# Z8 A$ V! v0 [5 e& M3 x
 </FONT></P></FONT>1 ]& m, ^6 S% \/ i7 z- n* e
<P ><FONT face=Arial size=2>  程序中应该有如下片断+ m, \6 D/ H4 T" X7 {" w) ]
 </FONT></P><FONT face=宋体>
! H9 A0 c( J/ p, r4 c2 f6 B$ q<P ><FONT size=2>    char szFile[256];</FONT></P>8 W7 L0 J, r; q& u) A# Y# G/ ^% t
<P ><FONT size=2>    CPackFile packer;</FONT></P>
% ]; f% E( t- I- x6 E4 _<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>: ~; [( q; k# ?3 k6 T2 ]2 F  s/ O! h' E
<P ><FONT size=2>    ................</FONT></P>
0 J3 O. T% V8 q<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
; M& M- S2 M$ u& y( Z% V4 }<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>4 O& R2 m; S$ _/ q$ ]
<P ><FONT size=2>    </FONT></P>
2 W* {9 }0 G9 H$ l' i1 }" {7 I<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
' V+ Q* l5 `3 r7 B3 X6 E2 a2 {% W<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
' ?# n, D6 X+ Q7 y) L; ]<P ><FONT size=2>  欢迎和我交流</FONT></P>
! p9 w. P" `5 N<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>8 O& \! o2 m7 |
<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>
1 F8 u+ y/ S6 W1 K+ ^: @* F<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-6-13 11:45 , Processed in 0.515111 second(s), 59 queries .

回顶部