- 在线时间
- 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>1 L2 a4 O/ J N) W
" }% ~5 ^8 z# r) g3 a& M+ w9 Z3 z
<TR>1 {# u6 N2 p: ^! t
<TD width="100%">
8 y5 q/ f/ p) ~: j$ V* H( Z4 Y2 j< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
' C9 q! H/ d* P4 m/ v7 \! u<TR>
# j. A; F4 n$ c" E2 {# C) x# J<TD width="100%"> </TD></TR>
) y4 |8 J; F8 i0 b; g$ C<TR>, |8 V! Z8 l$ T. d$ W
<TD width="100%"><FONT size=2> 打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:1 ~& V* m* c* o* z7 j2 L
</FONT>
/ S, D3 b# ]! ^2 v< ><B><FONT size=2>1.安全性。</FONT></B></P>
! a5 k9 F. y: Z" h% `& y+ f3 I< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
! e1 u9 d! F' ]0 |, X </FONT></P>% l9 i/ Q2 d4 T) A: ~, B) O
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>& I! ^% _0 ?0 \8 `; u
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。2 _% h$ t7 {$ E8 J! G7 ]' C
</FONT></P>
' G/ v) B ~! k5 B5 S3 A< ><B><FONT size=2>3.美观</FONT></B></P>
) v Q2 x$ ?) r< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。3 r& w& \4 }6 S8 B
</FONT></P>3 i; _1 Q. V! N: d
< ><FONT size=2>4.还没想到......</FONT></P>
" B1 G# M; i& t9 g& G) P< ><FONT size=2> </FONT></P>
+ K$ W R0 S7 \8 d5 Z8 r< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>8 {' G* s, C1 X0 V
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>5 ^, e6 q I, A) z" N
< ><FONT size=2>我想到的有以下几种结构:
0 i4 _9 T- `( k+ }$ C( B, f </FONT></P>+ G; R2 W: y; }& \! m
< ><FONT size=2>1.</FONT></P>
. f- n6 m. ^' O. O5 L/ V+ B< ><FONT size=2>{</FONT></P>& d8 B) C4 p" {; g
< ><FONT size=2> 文件标示信息 //判断是否是正确的打包文件</FONT></P>
( Q3 T$ T! s! j5 c6 `< ><FONT size=2> 文件的个数,文件索引表大小</FONT></P>! Q6 H- H- h! v7 _( k* l3 k( v6 c
< ><FONT size=2> 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>+ @8 t, V) I& ~! i
< ><FONT size=2> 各个文件内容</FONT></P>
k# Z& u& b: i# E, q' h2 e< ><FONT size=2>}. Q' u! ?. ]1 ]* r
</FONT></P>7 {* D2 m: N! {
< ><FONT size=2>2.</FONT></P>
& T4 k i3 ?( I< ><FONT size=2>{</FONT></P>4 `' W& J4 G! n$ z2 L
< ><FONT size=2> 文件标示信息</FONT></P>
& T$ b& }3 V3 }% V) }+ ^0 p< ><FONT size=2> 第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
: d8 q0 ?: ?; S' g< ><FONT size=2> 第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
2 }3 g/ M6 F# ]* Q< ><FONT size=2> ......</FONT></P>! N9 q8 h4 n) }5 K8 r
< ><FONT size=2> 第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
7 O( U) v6 w4 N% o" V8 K( _< ><FONT size=2> (文件计数)</FONT></P>8 k2 y) [, `: b; K( P
< ><FONT size=2>}* ?3 J5 G* }4 F; }+ G9 r
</FONT></P>
; M9 I, u6 t" H. ?/ E$ o" R< ><FONT size=2>3.</FONT></P>2 n9 V; q$ I P8 Z
< ><FONT size=2>{</FONT></P>0 N8 X6 H( \ W4 m+ S( O1 F& o1 @
<P ><FONT size=2> 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>& B! {) T& c- P" i# n2 U5 ~
<P ><FONT size=2>}</FONT></P>. Q& z; [9 U4 ~/ W9 C3 T! J+ u
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
1 w" R' \3 U* Z: \" p<P ><FONT size=2> </FONT></P>
* k l8 s& C8 t q% C; c<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>1 ]/ x8 ?1 E7 I3 E* Q% k
<P ><FONT size=2> 解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
3 P0 e5 E% A9 f. P7 o( f<P ><FONT size=2> </FONT></P>
0 w' }' @) Z7 J<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P> H8 k" `, f z5 N& H
<P ><FONT size=2> 最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
) k% X8 {. L4 j- a$ n<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)
5 M6 k" [$ j ^. D* `. I5 C </FONT></P> z) v0 S( j* j! b$ r0 }
<P ><FONT size=2> 在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
2 D, J: X( h% C% T( B) G l </FONT></P>
/ k5 ?$ v U8 S" a<P ><FONT size=2> //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>
# B% k7 n+ p% a( }: q<P ><FONT size=2> BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
8 F3 S9 I5 A1 b<P ><FONT size=2> {</FONT></P>
1 V- H& O Y: r+ s0 V# I0 l/ ~<P ><FONT size=2> #ifndef PACKER</FONT></P> S6 h$ u* |7 _- F; ~6 |. y, H
<P ><FONT size=2> strcpy(y,x);</FONT></P>/ Z2 J4 v* K+ P& p
<P ><FONT size=2> return true;</FONT></P>
' q# ^/ [/ k3 D1 U<P ><FONT size=2> #else</FONT></P>
, H0 R! Q7 S; Z3 P; E<P ><FONT size=2> 在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>6 x" {# c. V( O8 F7 J% Q+ N
<P ><FONT size=2> 否则,返回false</FONT></P>% V" x6 p) [. |. t) N r \
<P ><FONT size=2> #endif</FONT></P>$ j( }- s+ T" |( F( ^' i- c6 y6 `
<P ><FONT size=2> }
?, z) ?: N u </FONT></P></FONT>
# K" _* y# W+ b& o( u; x4 P<P ><FONT face=Arial size=2> 程序中应该有如下片断5 t" _. W; z- A" M7 f+ ^
</FONT></P><FONT face=宋体>% ^5 D# g; a0 Y1 z
<P ><FONT size=2> char szFile[256];</FONT></P>
% _& Z; ~3 L l- l$ e2 K<P ><FONT size=2> CPackFile packer;</FONT></P>1 V: y- b, t; D# J
<P ><FONT size=2> packer.OpenPackFile("somefile.pak");</FONT></P>+ R$ q4 u/ M! h u/ B, d
<P ><FONT size=2> ................</FONT></P>
3 A) e9 N- L. I, S! ?9 i& W& j<P ><FONT size=2> if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>2 I* m4 o [2 L
<P ><FONT size=2> do something....</FONT></P></FONT><FONT face=Arial>; F/ M/ W( _; b0 [7 c$ x
<P ><FONT size=2> </FONT></P>- \# P+ c$ s' J
<P ><FONT size=2> 下面看看我的具体程序吧!</FONT></P>
+ V2 L: F9 o% o<P ><FONT size=2> <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
3 r: T8 V4 Z3 U+ t2 M9 ^<P ><FONT size=2> 欢迎和我交流</FONT></P># ?& _9 p( `9 Z& R9 n. d: S
<P ><FONT size=2> <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
T' F' q& S" E, B<P ><FONT size=2> OICQ:30784290(难得糊涂)</FONT></P>
) a6 R4 c, n4 v% v/ ]6 C<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
|