QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<TABLE>8 I. T; \7 X+ n$ T( |3 L
0 s  G/ n6 I* ^# e  n" q' ]
<TR>
! Z; ^) Y0 t$ w; `5 m3 p+ e0 Y( G<TD width="100%">
- W  C( M; J& }' X  `< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>- w9 [3 y, m- M6 o) B, t
<TR>, {; g% m. o0 M5 D# @$ r
<TD width="100%"> </TD></TR>
. l' i7 A( E& N<TR>
) N1 ^6 U3 J5 r  A% q. g4 |<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:* p* M) F1 ?( ~0 U
 </FONT> / K* `, M' k+ s' y6 C7 T+ g
< ><B><FONT size=2>1.安全性。</FONT></B></P>7 J& W$ U5 s$ T# M5 O; d
< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
- a: G1 w; @% X( G0 u  h" }* I7 v! o) J </FONT></P>
# u! i- {1 C. D9 O* u: a3 F< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P># W; U8 n2 d* X5 g' B6 ]2 E
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
: ~$ R* x5 I$ g </FONT></P>
& l! ^% n. R0 D< ><B><FONT size=2>3.美观</FONT></B></P>
% Z% K2 G+ J3 R1 E9 ?5 S- c" @< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。5 s- i% v) b" {! P  S
 </FONT></P>
  D5 j7 {: n$ a# O  b< ><FONT size=2>4.还没想到......</FONT></P>! C/ W# |  I% Q/ H% Y
< ><FONT size=2> </FONT></P>- R3 e. _2 R- i0 F& ?
< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>& k2 h: Z2 t  U/ Y+ `+ K
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>; e4 ^. U! g$ h
< ><FONT size=2>我想到的有以下几种结构:/ V% Y) _, `+ C% g  Q5 @! L
 </FONT></P>
4 G( @0 K; m6 ~/ C< ><FONT size=2>1.</FONT></P>
( [8 {3 D/ n7 @+ P- y4 l+ h4 x< ><FONT size=2>{</FONT></P>3 ^5 T8 n2 |# U1 w2 _
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>- z; h* ^' ?' h' c3 q
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>, H+ e; B% r5 v4 m# Y* P3 F6 o
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
. r  ^" x4 O1 C+ Q0 _3 B< ><FONT size=2>    各个文件内容</FONT></P>
) l6 M( E$ D: A" y- d* c" Q< ><FONT size=2>}
" \: V8 b6 J/ ^# x </FONT></P>8 B8 \; P3 {8 n6 V- j: q. \, k
< ><FONT size=2>2.</FONT></P>6 m( k  i+ y" V
< ><FONT size=2>{</FONT></P>+ c, P9 g6 u$ r: E3 c4 @/ j
< ><FONT size=2>    文件标示信息</FONT></P>
: W+ j" G( |$ _9 v( {+ N< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>9 S- D/ Q0 m, y, p/ a% [
< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>" N) p$ [3 [% a' c/ Z
< ><FONT size=2>    ......</FONT></P>
. d% P8 [' D+ t/ _< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
0 a- ?3 n5 \3 k3 o  m< ><FONT size=2>    (文件计数)</FONT></P># O; a; }: r( [9 L3 O
< ><FONT size=2>}
9 W' ?4 W& H- G8 E) j0 G5 r </FONT></P>( i/ q+ Y9 J; F6 F4 V+ k2 V3 w4 {
< ><FONT size=2>3.</FONT></P>8 _5 B  j7 h+ h
< ><FONT size=2>{</FONT></P>8 k3 S( z# d# n( f( N- G& y" ?0 o
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
3 C( P0 i7 y8 ~4 c* _7 F. J<P ><FONT size=2>}</FONT></P>0 W- h  q* q, n7 |1 i
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
" I: A4 e5 a1 j6 V% _/ x3 H<P ><FONT size=2> </FONT></P>
+ S. U$ K0 f+ }- C5 T1 B7 }: G" E<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
- k7 [; O" ~3 {2 f4 [<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>8 c- b2 n- y3 h5 R$ V+ w
<P ><FONT size=2> </FONT></P>8 X( l/ N# G) K+ D* A
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>
8 G5 y1 A4 m: {+ H2 L<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
- k. D8 q- s. i' K0 w7 s" p% l! ~/ ~<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)% f; ^& o, ?6 S7 G2 g
 </FONT></P>
" {8 F) @5 g$ G6 F5 I<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构( Q  N& v" D3 \, J0 S" ^
 </FONT></P>$ f* o! T" l7 l' l; S0 [& y
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>, b# d" R2 \+ q1 l" e; m
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>) s# t" N* o0 p; U5 L: b
<P ><FONT size=2>    {</FONT></P>
$ |: C/ F) [4 [* e, b<P ><FONT size=2>    #ifndef PACKER</FONT></P>$ @7 n3 M  m9 g: l
<P ><FONT size=2>        strcpy(y,x);</FONT></P>
" i2 A; s$ Q3 s8 j; t% s<P ><FONT size=2>        return true;</FONT></P>
5 F2 l. I" T% B9 h. R* S<P ><FONT size=2>    #else</FONT></P>
3 U3 k, N6 O1 n, s+ V7 Q<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
. B" C- u6 r& E2 G/ ~) k# q( M& K<P ><FONT size=2>        否则,返回false</FONT></P>
; c" F5 k. O5 B% S" N$ Y1 [<P ><FONT size=2>    #endif</FONT></P>; ^/ b. k) W; j) p, \
<P ><FONT size=2>    }2 l& v! ]. U! _6 a% \
 </FONT></P></FONT>
+ {( ^- X6 d' |: q9 m<P ><FONT face=Arial size=2>  程序中应该有如下片断
2 i) N- p/ j5 v- K3 ], o' V: n$ n </FONT></P><FONT face=宋体>0 v& T6 n2 _; g
<P ><FONT size=2>    char szFile[256];</FONT></P>0 `- n: B- ~& t( A" f8 ~, N
<P ><FONT size=2>    CPackFile packer;</FONT></P>% l' u# e( B! e6 P( ?- ~* K* [
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
% v6 `( v- h; H. S<P ><FONT size=2>    ................</FONT></P>( v9 ?  n) |2 z, s6 T" u1 Q
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
. W/ p% |: V9 }2 m  d) k" I<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
" b8 N, c6 V( S! w# M3 e<P ><FONT size=2>    </FONT></P>+ D0 ]7 {0 C, g7 H7 X4 S& |5 n5 o
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>( R& i7 e0 U9 T. v
<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
: N* W+ C3 x- O8 S* a4 ^9 e  c: [) \, ]<P ><FONT size=2>  欢迎和我交流</FONT></P>
* G5 G( O+ J( D<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>  {% G+ H; ^6 o% m8 i, f" p! `
<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>8 E7 ^% C2 D4 {, Y9 o5 E6 a- V
<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-21 01:24 , Processed in 0.432423 second(s), 58 queries .

回顶部