- 在线时间
- 0 小时
- 最后登录
- 2005-9-21
- 注册时间
- 2004-4-27
- 听众数
- 1
- 收听数
- 0
- 能力
- 0 分
- 体力
- 1027 点
- 威望
- 0 点
- 阅读权限
- 40
- 积分
- 385
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 153
- 主题
- 43
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   28.33% 该用户从未签到
国际赛参赛者
 |
<TABLE>0 M7 Z' p- ~; e! H! c
, [9 Q1 n1 D# w/ b2 i- z<TR>5 z* r% H% I S6 A0 E$ ~. `
<TD width="100%">& g* A, z# M0 T# t; M+ J* _) L
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>2 v; k, ~, @6 M: [
<TR>
' E" o. `, g, C( D- t$ t Z; U<TD width="100%"> </TD></TR>
: M& O; W* r8 r# _% d$ c6 R<TR>. @1 p+ M& e% F1 x+ p3 a
<TD width="100%"><FONT size=2> 打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:; w' |% D, [6 j
</FONT>
0 `% z3 m6 m$ h1 {0 U< ><B><FONT size=2>1.安全性。</FONT></B></P>
& y5 H3 D; e4 p5 x* c# `& e< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
/ T% }1 R0 O! A# b5 @+ K </FONT></P>
0 ^; {3 O, r2 e) C Y: j0 {< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
8 w; `9 M9 d, U8 b< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
8 u- V2 I4 K! K- D </FONT></P>
0 J" G1 _4 K. ^/ C2 A! \- ]" k8 _< ><B><FONT size=2>3.美观</FONT></B></P>/ a3 `5 o! ? B5 c7 L
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
) T7 G: q" A! M! K </FONT></P>
' f5 _$ ]$ e! j# k< ><FONT size=2>4.还没想到......</FONT></P>/ ?, p/ m, K6 _6 ~* C( Q. u2 [5 x
< ><FONT size=2> </FONT></P>/ X* }+ r; F! \1 |" m1 H7 Q$ w
< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
. } p+ V+ q: C, G$ K! O" Q% f+ S1 i< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>! `! O( x/ e# G% U4 Z' K
< ><FONT size=2>我想到的有以下几种结构: W5 [% `& V2 D/ p8 l' Q+ H7 w
</FONT></P>; @0 v' ^1 n4 D8 M* u( C0 J, c6 C
< ><FONT size=2>1.</FONT></P>% q0 r$ S; Y$ M' h* {% t
< ><FONT size=2>{</FONT></P>: n) t1 H2 s0 c2 f5 Q( y
< ><FONT size=2> 文件标示信息 //判断是否是正确的打包文件</FONT></P>
, U z! ^% Z4 O. ~< ><FONT size=2> 文件的个数,文件索引表大小</FONT></P>
; B, T: n0 w" I+ O< ><FONT size=2> 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>& d* }; a4 `* `/ ]
< ><FONT size=2> 各个文件内容</FONT></P>) S5 F S7 Q! R# g6 b% K
< ><FONT size=2>}( Y- d! q5 O5 `0 G
</FONT></P>
9 l8 \" G6 Y5 R6 I< ><FONT size=2>2.</FONT></P># Z8 O7 m5 J) n8 `
< ><FONT size=2>{</FONT></P>
1 E: y( F3 v' Y+ t0 l2 Z. p< ><FONT size=2> 文件标示信息</FONT></P>$ @/ ~' L! D- X6 {3 a
< ><FONT size=2> 第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>9 a1 W( s4 p- P7 q
< ><FONT size=2> 第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>6 Z# K4 G# t9 c4 G0 e
< ><FONT size=2> ......</FONT></P>
, j/ `; l6 n y) |6 R& q) I i4 m0 t< ><FONT size=2> 第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>7 k' r- R/ e" _% i* i
< ><FONT size=2> (文件计数)</FONT></P>- f" S' e3 v- W% z' M. s" G
< ><FONT size=2>}
% B. x1 V+ `- N: i+ ? </FONT></P>
8 m6 [2 O3 g4 O `$ F< ><FONT size=2>3.</FONT></P>
( W; N; P/ O- [# L J* p( |2 U< ><FONT size=2>{</FONT></P>+ U1 P( l3 c p# ]
<P ><FONT size=2> 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
/ {* l- t- r+ C7 q<P ><FONT size=2>}</FONT></P>7 A4 L+ Z. ^) ?" f- m ^# Y
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
) M! c2 M% L% h% [3 f<P ><FONT size=2> </FONT></P>3 [6 ]9 R; R$ v% E# r \! D' [5 T
<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
- j8 ]2 }$ `8 ?5 J5 d" E<P ><FONT size=2> 解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
; G U* p) ?1 F7 A<P ><FONT size=2> </FONT></P>9 T I! X W1 _4 b
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>0 N" E' c* ^* D5 X. P
<P ><FONT size=2> 最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>! S& i. v7 g" P- F2 m9 A# p7 q( n
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)' C( a5 e2 ?- Y. b
</FONT></P>
* b/ }. u4 w6 I8 ~- w( o! }<P ><FONT size=2> 在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构" @9 r2 w6 i! q" {8 m7 b
</FONT></P>
2 h% B( q* \1 a+ d$ k' e5 \( r<P ><FONT size=2> //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>
0 U; ^& Z2 E- R2 r2 O<P ><FONT size=2> BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
% q3 _& N! G2 p( x: c5 m<P ><FONT size=2> {</FONT></P>
& F2 i+ W x0 ?( w! i8 {<P ><FONT size=2> #ifndef PACKER</FONT></P>
! \( \) e5 w' T: \7 ?9 M- o<P ><FONT size=2> strcpy(y,x);</FONT></P>1 H- F @4 T5 L. t
<P ><FONT size=2> return true;</FONT></P>; q* `& n2 E" o. Q- @/ f0 A: u; X
<P ><FONT size=2> #else</FONT></P>4 V& V( ]1 x6 q5 V$ c9 @
<P ><FONT size=2> 在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
[4 F$ H; d3 J g3 O<P ><FONT size=2> 否则,返回false</FONT></P>* o/ p) }3 d5 Z* d2 _7 p
<P ><FONT size=2> #endif</FONT></P>
' D* V9 f* [" i; a<P ><FONT size=2> }! q! ~: m5 D8 {( P0 R& [
</FONT></P></FONT>
' l8 m' ?. V R$ r<P ><FONT face=Arial size=2> 程序中应该有如下片断' L4 ^ o, f1 e0 u [, l4 Q1 A
</FONT></P><FONT face=宋体>
# S3 Y# ~3 U$ a<P ><FONT size=2> char szFile[256];</FONT></P>
8 {, h" z2 o b, T5 e: L# x<P ><FONT size=2> CPackFile packer;</FONT></P>
' L9 N( N l1 z9 O<P ><FONT size=2> packer.OpenPackFile("somefile.pak");</FONT></P>' j) w P1 S4 k% b* K) o% G
<P ><FONT size=2> ................</FONT></P>
9 d4 P3 w% N; Q) Q0 X<P ><FONT size=2> if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
c- B0 g4 F$ l8 Y4 F& |<P ><FONT size=2> do something....</FONT></P></FONT><FONT face=Arial>1 V9 t$ K2 t+ A& d, N* \
<P ><FONT size=2> </FONT></P>
) o/ j9 t: @& k7 x<P ><FONT size=2> 下面看看我的具体程序吧!</FONT></P>
3 r' u4 O8 N* {<P ><FONT size=2> <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>+ D/ c" g+ o' }6 F! d
<P ><FONT size=2> 欢迎和我交流</FONT></P>, X7 w9 Z) W& w& R/ H. k% C* M8 U
<P ><FONT size=2> <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>8 g" f2 U% K2 L1 A" T* K6 s
<P ><FONT size=2> OICQ:30784290(难得糊涂)</FONT></P>- M3 s$ L% h: i, ?# l& |
<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
|