QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>+ ^% Y  }( f- O' `' J$ b% B

  S3 B2 w- V  k& O<TR>
$ w  S/ W. N! c* a6 T2 c4 }<TD width="100%">
; X/ ?+ j$ {# D/ Y& c< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>, M$ b) \1 G9 m" a% H; C* `. V
<TR>
" T1 z: Y7 ~, j& c- l8 S8 x7 N<TD width="100%"> </TD></TR>/ |7 @4 {1 m0 Y2 y
<TR>
# n* I6 ?% N) O1 J. F$ Z2 i# k<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:& i  T" g3 `1 S- Y  g
 </FONT> & y5 ?! w% d. s- `3 U
< ><B><FONT size=2>1.安全性。</FONT></B></P>
7 k% ]0 c8 F! f- o< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
! |4 n4 r3 P. v" x& H/ ] </FONT></P>
* `& @. H& w8 A4 D" ^< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>$ {9 T$ x5 W6 r$ A5 n: F
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。5 L  i9 s( r6 @8 e) Q0 R
 </FONT></P>
6 G% y, Y/ c3 u  H# e; v5 `7 O< ><B><FONT size=2>3.美观</FONT></B></P>
7 O" S) E$ |) h6 v. z7 E& a< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。- {' R- X8 |2 A4 }. b
 </FONT></P>) z- W. U  K$ s5 `
< ><FONT size=2>4.还没想到......</FONT></P>
: s% Z& e6 g  q! r3 u< ><FONT size=2> </FONT></P>
6 J5 F& H$ y9 ^; d1 s/ O< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>5 N. z1 _& L9 j0 J/ v8 n; D1 V
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
1 c% D! C, J, L& A< ><FONT size=2>我想到的有以下几种结构:
/ Y9 p* i$ e" b </FONT></P>
% s! f! o5 g# @( ?4 q/ i< ><FONT size=2>1.</FONT></P>
) w- n0 y; M2 Q* z9 z' g9 O  [< ><FONT size=2>{</FONT></P>& h8 b$ k, a" {. h' `8 a
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>1 p/ Z/ d! E% B/ I
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>
' h4 G7 H; P0 O8 s# x< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P># E% O! ~/ a% D0 J( `7 W
< ><FONT size=2>    各个文件内容</FONT></P>3 `: r$ F1 M  x! ^
< ><FONT size=2>}
' J0 s( Y3 F& U+ Z </FONT></P>
& K2 U6 c! O, w( |< ><FONT size=2>2.</FONT></P>; g5 O& v2 B! o  i! x: G1 b
< ><FONT size=2>{</FONT></P># E; a' E% b* j. O2 {) f3 d  S- ?2 L
< ><FONT size=2>    文件标示信息</FONT></P>
) D% T! U) o9 H5 r& @7 H< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
1 E8 }" n8 W* {4 f2 y% C< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
) E1 u8 _9 j8 Y/ R! z# \< ><FONT size=2>    ......</FONT></P>2 M8 |9 I1 u/ i: T$ O9 b/ s
< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
9 o" p: S2 d" a4 p< ><FONT size=2>    (文件计数)</FONT></P>
( ?/ F8 K5 \' g< ><FONT size=2>}
5 ], _# B: D6 p% s. X </FONT></P>
2 m# ?# K2 z1 d* f1 T< ><FONT size=2>3.</FONT></P>
! T% E+ \5 ^2 _! Z1 P) \+ w' g- e0 p< ><FONT size=2>{</FONT></P>
* d( m, o$ N6 z1 W& Y' A  ]/ }<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>$ b/ Y6 A/ y6 x. B
<P ><FONT size=2>}</FONT></P>/ G9 {& C$ ]4 O; O# R1 S
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>) h3 {' u2 W' ^9 {; L, Z7 N
<P ><FONT size=2> </FONT></P>
2 u) K( Z. N7 D* e<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
% r. B; u: B; G( ~& I! K; ]<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>( R' Y: o( J: z+ P% P
<P ><FONT size=2> </FONT></P>5 w( L& Q* [9 h1 D" d/ d
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>3 u" ]' `6 R9 {* Q& V8 H
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
. ?6 a( U% |: ~, K, H* g<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之); V" v' E+ y# j0 S) ?
 </FONT></P>
% x/ z3 @  [& s, n<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构$ z3 \' M! |9 {# g6 x: }
 </FONT></P>
; [4 P$ e  M+ u/ |: B- F( l<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>% I2 j3 r8 C$ x
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
: L, I: a" x% s/ @. C<P ><FONT size=2>    {</FONT></P>
8 c4 w0 i( e" Z' e# `<P ><FONT size=2>    #ifndef PACKER</FONT></P>
1 B/ Q$ [! _" h( t% y<P ><FONT size=2>        strcpy(y,x);</FONT></P>
4 Q4 ~! M$ b6 b0 b; m% {- ^<P ><FONT size=2>        return true;</FONT></P>' v, F' R" m8 f* \/ o
<P ><FONT size=2>    #else</FONT></P>. o$ a! s4 Z8 U! I/ j3 U6 z
<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>, w% F( _  U+ Q* P' b  ~3 y$ _
<P ><FONT size=2>        否则,返回false</FONT></P>
( z  z3 w# C# D8 k<P ><FONT size=2>    #endif</FONT></P>
- B4 J) y+ l/ f/ C) t" [<P ><FONT size=2>    }
5 l3 s1 u2 b( h8 ]0 ?' e' c1 P& S </FONT></P></FONT>
0 T5 ^. @  z( c2 d% h/ ~& \6 d6 {' h<P ><FONT face=Arial size=2>  程序中应该有如下片断  T0 C) @0 G6 }
 </FONT></P><FONT face=宋体>
7 X3 V' A! i/ a# C. u<P ><FONT size=2>    char szFile[256];</FONT></P>
# G4 U6 I8 M* v# T<P ><FONT size=2>    CPackFile packer;</FONT></P>2 g* v8 B/ X" t3 M  g& c" c7 w/ F* ~
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>* U1 i4 o+ e- Z" n
<P ><FONT size=2>    ................</FONT></P>( x3 ]4 M& |9 s
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>- ^! n6 B5 P- |5 D0 s# F: `0 ~1 r
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
, b4 H. Q1 K4 e" y+ k# D<P ><FONT size=2>    </FONT></P>
: D+ Z1 s4 ~: _$ ?  U1 C5 t<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
  O- X' z+ C5 i" L; Y1 o<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>2 \8 {! D" U" v
<P ><FONT size=2>  欢迎和我交流</FONT></P>
' l1 E4 x8 N& B) T, ?/ \7 J<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
# v: `8 v' [) d' E<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>. A5 D  \# r. F! Y
<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-10-23 09:05 , Processed in 1.899427 second(s), 57 queries .

回顶部