QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>- u* O; u& A# p7 `
# Z; A4 A7 \3 T, w! _- t
<TR>) ]6 \4 O+ n+ I0 y7 b
<TD width="100%">0 k; ]# Q3 y9 p2 F) N
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>2 [# s+ @' b6 q
<TR>+ ~9 Y6 U( b7 c: y
<TD width="100%"> </TD></TR>
/ P* p! h7 l9 k- h, D<TR>
) p7 z( \" Y1 {. M) m4 n5 P<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:+ N3 ~2 S. V0 M, v! m5 Q
 </FONT>
# `3 @! [; n  x< ><B><FONT size=2>1.安全性。</FONT></B></P>/ x% A) u& _6 W; T" ^! r' y
< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。: q! P7 D6 f' ^2 l7 ~4 `# d
 </FONT></P>: j* ?  w0 I" _' I
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
2 N( v" A) M3 ?< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。3 x6 h% R, A! g$ `3 u
 </FONT></P>8 X  L4 m9 q( {: r7 t' d2 b
< ><B><FONT size=2>3.美观</FONT></B></P>
/ v3 D8 _& v+ o& W6 E2 U< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
1 j/ ^: V! T8 e+ F$ y </FONT></P>
  P, O1 _. |) T7 T: c/ O( Z2 H< ><FONT size=2>4.还没想到......</FONT></P>- e" o) C: R8 u6 q& Y0 e
< ><FONT size=2> </FONT></P>  M. b6 `) Q1 U2 c8 c& x
< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
; r9 v# _" v# s7 M1 [/ ^6 _$ n2 T< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
8 M  m! z! W* B$ `< ><FONT size=2>我想到的有以下几种结构:2 Z3 j4 h2 X  D8 G$ Y- K  K
 </FONT></P>
7 W8 v6 T+ e1 }5 b< ><FONT size=2>1.</FONT></P>
# F' s! b1 T& C2 Q: E3 ^2 W$ I< ><FONT size=2>{</FONT></P>1 n  O$ }2 C2 P0 Q0 u6 U6 e. }
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>
; l; H( ]& a: G0 N! b) l< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>' t( P  i1 l4 o  t5 P2 x- |' H
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>! u4 }/ q5 d5 g5 X! u* ?4 N% A  b
< ><FONT size=2>    各个文件内容</FONT></P>
2 m+ z! p( Q9 `+ B1 S  a  O( A< ><FONT size=2>}/ F- d6 U% A9 ^
 </FONT></P>2 W3 X6 K" o9 n, q
< ><FONT size=2>2.</FONT></P>
) ^# l& v' `8 k< ><FONT size=2>{</FONT></P>
: n4 l% w( Y. ^5 G. a- Q+ c2 y< ><FONT size=2>    文件标示信息</FONT></P>
1 e9 f- E: @, W5 H- h1 A< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>+ g) G- I3 t  R3 k, Y
< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>: ]3 j3 g" y: O7 ^' P1 D5 e
< ><FONT size=2>    ......</FONT></P>
" R/ m# ^$ g" F; x* @< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>. p" g7 c6 ^/ p& `7 L4 ^
< ><FONT size=2>    (文件计数)</FONT></P>
) a3 w. x1 i6 m8 W+ j: ?< ><FONT size=2>}
2 g0 [& o* R) X6 ]' d$ s7 o </FONT></P># ~. `% G' [( m4 ^# p( j
< ><FONT size=2>3.</FONT></P>
& V6 e# w. V' }+ ^) H' l+ G8 T< ><FONT size=2>{</FONT></P>& ^! ?& N1 g4 Q0 {2 O
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
6 J+ E8 K7 @. @$ _<P ><FONT size=2>}</FONT></P>  l/ e3 u; m% r7 E+ e+ n
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>2 E& _& m8 T  T. a2 c
<P ><FONT size=2> </FONT></P>
& V/ V7 x3 B/ L4 C<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
& j- H6 _( \& {5 J<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
. t- P# x) d: i& b  g<P ><FONT size=2> </FONT></P>7 r8 r; ^0 D5 C( g$ h. c! D
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>4 E- d. ?) U7 u0 J
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>% ^( L' ^, ]- b1 P2 u) Z6 Q0 P* @
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)1 {/ N) Q: p  p0 k9 w1 W) z- S7 B
 </FONT></P>
5 U. K( Z% ]5 K- B, N. S<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构. `( M# T/ P' i% ?8 B5 X0 m
 </FONT></P>
' o4 D# S9 Q4 q! L8 B<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>! L$ G7 `4 n0 H, a
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
8 x2 s/ {. I6 V' I- k/ Y( S8 v<P ><FONT size=2>    {</FONT></P>
9 |( X' N9 P! n3 Q7 ~1 ~7 m% ^9 `1 p<P ><FONT size=2>    #ifndef PACKER</FONT></P>% }2 q% r; p2 j- j# {
<P ><FONT size=2>        strcpy(y,x);</FONT></P>: s0 ?' `  r  v6 D
<P ><FONT size=2>        return true;</FONT></P>) K/ m5 j; U! H
<P ><FONT size=2>    #else</FONT></P>
. B2 Q9 |- }8 u, a% D/ |9 J8 _+ u<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
  `  e. r9 s2 ^" W1 K<P ><FONT size=2>        否则,返回false</FONT></P>0 n! c3 u' Z  V! F
<P ><FONT size=2>    #endif</FONT></P>
( P, \1 _9 L9 N- W. O7 b- t- l2 D<P ><FONT size=2>    }; X' }" i/ Y6 N8 l! l
 </FONT></P></FONT>
. E! |  u, K4 Y' R) L) e<P ><FONT face=Arial size=2>  程序中应该有如下片断
8 y2 g- r  U% u$ q </FONT></P><FONT face=宋体>
3 z4 O. ^% v& g/ Q  Q/ G: ^. L<P ><FONT size=2>    char szFile[256];</FONT></P>
" E% ^5 o6 o- c* ?; p% W1 y<P ><FONT size=2>    CPackFile packer;</FONT></P>5 d- v7 \# K6 ?% z: Y  m( f. W
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>( _9 F7 U# A4 u# N
<P ><FONT size=2>    ................</FONT></P>; f; v: \- x$ p- W5 j! ], L- k
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
5 N- k2 c3 }7 z: ]  U! b! K<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
. z& {( Z" J2 B% ?2 f<P ><FONT size=2>    </FONT></P>
- |1 L+ N, ]) y( y7 z, ?<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>2 P. P! v8 T/ X: S. j. Z
<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
1 E) h: N1 S8 F" E. Z<P ><FONT size=2>  欢迎和我交流</FONT></P>
& C3 o) P% P* K<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
. ]$ |2 G7 Q) V$ A( }( v' k<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>- Z8 `8 T% ]1 z7 f/ K$ J
<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-14 05:29 , Processed in 0.433810 second(s), 58 queries .

回顶部