QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>; f6 [+ _& s2 h+ {; S& W

3 R/ N& R& r( B( m) x<TR>4 V+ Z+ p& Y$ F% M
<TD width="100%">
: H5 c. B; x, Z< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
" \/ S5 c- u# l" ?9 C; f. x<TR>
! t0 s5 c+ v5 c5 [& _. E! j" `3 \<TD width="100%"> </TD></TR>
, ^0 i* k$ U) v( O! ]<TR>
& M5 q, J$ c$ r5 L7 d<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:  z0 l, n- l) e9 A; e6 y# [8 B
 </FONT>
2 S9 e3 v/ H. Z+ W' n< ><B><FONT size=2>1.安全性。</FONT></B></P>
: K) ~9 D! G8 H+ n9 r* P. P< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。  z. `$ c, {  ~# U3 |
 </FONT></P>
; I; V* M6 {2 n/ q) o2 W< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>2 x9 e) a" C4 d% }- F; L
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。0 ~* S* S4 H) R# z
 </FONT></P>
7 x+ A, i: P% U1 o< ><B><FONT size=2>3.美观</FONT></B></P>
3 _  x3 V- x7 P1 j. |$ p1 R2 ]; i< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。: x$ e7 I' z% Q' f5 c, S
 </FONT></P>3 k! ?9 U  g; I; m# A
< ><FONT size=2>4.还没想到......</FONT></P>
& n- l6 p/ {  Z- l) [, q2 ?. z< ><FONT size=2> </FONT></P>
- t6 d# }& Z9 `; N4 H* l# l< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
. A3 }+ P8 M( B. h% B2 b< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>8 i, y8 `" S; n0 X3 s& h
< ><FONT size=2>我想到的有以下几种结构:$ l* ^7 c, K, o4 w- G0 X
 </FONT></P>
& d6 i1 w) `/ F3 E7 L< ><FONT size=2>1.</FONT></P>
8 D" f. s, r& A9 ~" w. e2 w% l/ J< ><FONT size=2>{</FONT></P>; l9 [+ k5 u( @# `
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>' o- }& K* C# |' U+ z' J0 j* g) C4 _
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>* I+ p/ X$ d) ~
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
, w. Y8 {/ T1 a2 X1 W) @< ><FONT size=2>    各个文件内容</FONT></P>/ _( X8 L. A$ }$ v3 B* `; A
< ><FONT size=2>}! j; h( S) y. n6 Q3 v% n: a( O! j
 </FONT></P>
5 w6 s3 w6 m: z/ c8 Q! M) d' t5 _< ><FONT size=2>2.</FONT></P>- ^3 C6 f7 l' y. B) h7 H
< ><FONT size=2>{</FONT></P>
! N2 U0 r% I2 ^< ><FONT size=2>    文件标示信息</FONT></P>
& ?8 ]3 y2 `6 {. S. ^< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
. D; D6 E7 ]0 `1 D2 I4 g$ G< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
1 {" a* b- T4 o$ x< ><FONT size=2>    ......</FONT></P>
3 c% y! {. n7 ^6 h& y" r7 d/ d# _. o: H< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
, U2 P9 X8 M( r< ><FONT size=2>    (文件计数)</FONT></P>
" w: ?) n- a: ~! a8 i1 j4 h; \0 u< ><FONT size=2>}9 N1 m5 {% T0 B, @% Z' O
 </FONT></P>  B, d9 w4 B1 J
< ><FONT size=2>3.</FONT></P>( P9 M' C7 S5 e) M5 K  I; y
< ><FONT size=2>{</FONT></P>
; g" e2 p0 w0 M3 r1 F<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
( O- v0 h4 O+ z% t' i<P ><FONT size=2>}</FONT></P>
7 y; }5 ~# e$ ?! O<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>4 \, I: D/ _- C9 r/ o' Y1 u8 _
<P ><FONT size=2> </FONT></P>  |7 t  V  L  E0 m0 a. O
<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
# J8 \& T) a9 D! @: F<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>8 F- K0 N' r5 A7 I5 X% l  [; N% l
<P ><FONT size=2> </FONT></P>4 m& a8 l) z/ o) D( I# r
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>3 G, u& q! U( q) A/ a/ M* ?
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
. O5 @; p0 @3 v5 x) f3 D: a; p<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)# W+ ~8 U& {. F- B
 </FONT></P>% q, @( C5 f9 J* ?
<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
; b: z/ _0 k. `" d9 C# v- D </FONT></P>3 \0 c+ K( M* O
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>6 r( e6 X  J0 y4 ]% V
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
! s) q' S. L, l$ O" Y, b<P ><FONT size=2>    {</FONT></P>( `2 h/ K$ c  g
<P ><FONT size=2>    #ifndef PACKER</FONT></P>
# E1 [0 ?1 e( U- K8 [3 B<P ><FONT size=2>        strcpy(y,x);</FONT></P>8 c4 N4 |; C' s) G" T2 `1 C! X
<P ><FONT size=2>        return true;</FONT></P>
: K3 O" D! B2 a4 Y& k<P ><FONT size=2>    #else</FONT></P>
5 L3 J* o" ?$ n' i7 v4 I<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
0 V* L8 c( J5 D+ j0 Q( t<P ><FONT size=2>        否则,返回false</FONT></P>* Y; u2 A! k  `( H0 d7 U
<P ><FONT size=2>    #endif</FONT></P>
& |: F: c. g/ B- }<P ><FONT size=2>    }
( s( k  k$ Y/ H! O) e </FONT></P></FONT>( D" L% E: S, ^6 {
<P ><FONT face=Arial size=2>  程序中应该有如下片断
' x; Q  y* W7 ], f* T- @ </FONT></P><FONT face=宋体>
' O! g3 H4 B" o/ C( i<P ><FONT size=2>    char szFile[256];</FONT></P>
. W4 r7 I3 z" ]: W$ I<P ><FONT size=2>    CPackFile packer;</FONT></P>% T6 W0 Z% z4 w$ d- c/ Z9 E
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
; H4 {% |9 O' |$ i9 D6 g' }<P ><FONT size=2>    ................</FONT></P>
* e' b' M5 @6 }( }3 `<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>' K) N, L7 U" p: k- T
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
/ f& v/ Y0 B+ A1 }, N<P ><FONT size=2>    </FONT></P>  p( ?0 H; M. `
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>) A2 ]- }. h5 \9 p
<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
5 x* M3 D  T1 ~; x4 z  g<P ><FONT size=2>  欢迎和我交流</FONT></P>4 V3 z5 d, l0 j6 y' \' z
<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>$ T1 j5 P, R/ |
<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>4 c6 f8 J1 c+ g( h( o+ J  u; @" ^' N2 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-7-21 08:56 , Processed in 1.979285 second(s), 58 queries .

回顶部