- 在线时间
- 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>2 v6 B) g% P* @. t. Y$ S( ?
+ E7 Y; Z, V/ Q/ B- u; T<TR>
8 x1 F3 a& x* g: a; l W0 `, R$ ^- s. s<TD width="100%">
$ t4 ~4 ~: o, u5 n< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>0 B5 o, R" m' i$ X5 j0 J% s
<TR>) j6 ~' c1 E3 }4 Y
<TD width="100%"> </TD></TR>* s& {+ X0 s& K/ Q
<TR>5 q8 }" M0 C, R, A. `" n
<TD width="100%"><FONT size=2> 打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:2 S: d( l) C ]$ O
</FONT>
+ d1 e. I* Q3 z< ><B><FONT size=2>1.安全性。</FONT></B></P>% f% e* Q" L5 y3 N" {
< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
4 N: {/ |7 q! n, R </FONT></P>7 _/ ^, i/ O- ?9 j( F3 Z3 l
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P> X+ U# m9 I9 ^, E) c' U
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
% C1 @& k2 R l9 Y; }; P0 g0 E0 Y </FONT></P>
+ ]( ~! j* f: P! q9 A T2 X, f. C< ><B><FONT size=2>3.美观</FONT></B></P>' Z* f: W! e; z" H
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
2 G& U3 v' d. V6 f9 V1 [1 s% X, _; A9 \ </FONT></P>7 ? r% q1 ?4 j |& F. p( ^9 Y
< ><FONT size=2>4.还没想到......</FONT></P>
" k3 f' X3 L9 y0 q/ o0 k< ><FONT size=2> </FONT></P>
& T1 h. Z& H' r$ a/ F, ^) z1 u8 Q8 U& s< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>' _, s9 c. U9 |4 u+ |" n
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
) ^3 t" Y, n2 Q1 E. w8 A5 F' h< ><FONT size=2>我想到的有以下几种结构:
9 Q/ [- a6 B4 V6 h3 a </FONT></P>- ` S/ H( B j! U
< ><FONT size=2>1.</FONT></P>
. ` c o7 j X4 c/ x/ R1 v8 j1 z+ i< ><FONT size=2>{</FONT></P>
3 v5 s0 c5 o4 c6 k2 ?/ s< ><FONT size=2> 文件标示信息 //判断是否是正确的打包文件</FONT></P>
% ~- X: ~# m+ I$ w( j y- w< ><FONT size=2> 文件的个数,文件索引表大小</FONT></P>. D- J7 [1 m& X% E2 h! i/ e: ]* W1 }
< ><FONT size=2> 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
* _7 ?9 U* i a' J# k< ><FONT size=2> 各个文件内容</FONT></P>
+ Q! E, u9 O7 P< ><FONT size=2>}! f# O) ^ X' K8 n6 Y+ g6 f1 e
</FONT></P>6 V! _! U# i5 A: k. d+ L
< ><FONT size=2>2.</FONT></P>+ X7 J# w( m8 ^0 }" N
< ><FONT size=2>{</FONT></P>+ R4 Q* p# M& u) {" y: {* M
< ><FONT size=2> 文件标示信息</FONT></P>) c0 Y/ l) r$ b2 k2 i5 }
< ><FONT size=2> 第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
% H3 W) `+ A4 K+ c< ><FONT size=2> 第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
% Z5 Y3 Q _- A \$ f; _' D8 y< ><FONT size=2> ......</FONT></P>" y& a# c/ y# h: Y7 K" P6 |
< ><FONT size=2> 第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>& ]' h( o" _& |, [/ d0 Q' T9 z
< ><FONT size=2> (文件计数)</FONT></P>6 b6 @+ |0 J# p8 K; w4 r5 E
< ><FONT size=2>}1 h( s+ y- R7 F6 {
</FONT></P>
5 y3 D" v: K( Q< ><FONT size=2>3.</FONT></P>% y- {: @0 x* a
< ><FONT size=2>{</FONT></P>
; Z. W1 y: y4 L2 b0 i* W<P ><FONT size=2> 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>2 Y j `1 v j( v3 A. p7 B3 z
<P ><FONT size=2>}</FONT></P>* L" Z: M& ]5 v7 W, k
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
/ |9 h) I# F: |5 O9 ~<P ><FONT size=2> </FONT></P>5 h5 }1 B( m5 ~( P% f
<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>( @2 E6 \5 j0 j6 ~" s! T& u: a. z
<P ><FONT size=2> 解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>/ `8 ~' I: w. h& |3 m* {, L) W
<P ><FONT size=2> </FONT></P>" ]8 V+ t( _) j# d# e8 t) ?
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>& Y! J& I% U( K% r
<P ><FONT size=2> 最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
3 e" X( M+ s$ e5 f5 d: v, I9 F<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)
; i" F3 U' H) ^% S$ `+ w2 h1 n </FONT></P>
8 m, ^& i1 U& e4 w, y" c1 o* u<P ><FONT size=2> 在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构5 ^0 h$ X6 {5 b6 X h* O Y
</FONT></P>' q# w5 Y- h+ ], g! C# P5 o$ M: [0 Z1 H
<P ><FONT size=2> //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>
! {1 C9 m# e. h6 J7 A8 w<P ><FONT size=2> BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>8 w4 T& D8 O( k& r% y% A' O# H
<P ><FONT size=2> {</FONT></P>
/ {( o! s0 B' A n<P ><FONT size=2> #ifndef PACKER</FONT></P>8 d2 W8 f& U5 H- B8 a
<P ><FONT size=2> strcpy(y,x);</FONT></P>6 J+ r4 Y/ O4 s6 y7 u
<P ><FONT size=2> return true;</FONT></P>. v# i5 @4 p; [- F$ E
<P ><FONT size=2> #else</FONT></P>
5 x" V( i4 n* H6 q/ w- A' g2 E<P ><FONT size=2> 在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>0 s$ ^$ B0 \/ m& N1 k8 J
<P ><FONT size=2> 否则,返回false</FONT></P>6 Z% f2 A& J7 `/ @6 t" a
<P ><FONT size=2> #endif</FONT></P>
$ R! m! o/ _8 _; l<P ><FONT size=2> }; m: A: o9 E2 ?5 c; n1 e, |- D3 w0 H
</FONT></P></FONT>9 n9 b% u' W6 y5 v/ @/ R
<P ><FONT face=Arial size=2> 程序中应该有如下片断; h' v7 f6 R9 s/ A6 e; p1 N
</FONT></P><FONT face=宋体>
8 d+ G! Y+ i4 c- O% G<P ><FONT size=2> char szFile[256];</FONT></P>4 I. w# E2 ~' o$ Q, [3 p0 Z
<P ><FONT size=2> CPackFile packer;</FONT></P>8 C& ^: x$ X+ L$ z% T
<P ><FONT size=2> packer.OpenPackFile("somefile.pak");</FONT></P>- {2 m2 M. t/ a, |; P }! |5 |
<P ><FONT size=2> ................</FONT></P>
. w: y0 Q( r. n<P ><FONT size=2> if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
" t- j( ?4 [5 L# W<P ><FONT size=2> do something....</FONT></P></FONT><FONT face=Arial>" Q: I! z- q+ G: P- e: W- e
<P ><FONT size=2> </FONT></P>
& Y8 L- z5 p2 T* V3 Q9 ^# A<P ><FONT size=2> 下面看看我的具体程序吧!</FONT></P>$ G" X/ ?4 n% h# @# `/ b
<P ><FONT size=2> <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>1 q$ k5 n' u6 O
<P ><FONT size=2> 欢迎和我交流</FONT></P>
0 ]# t/ R! V) B; n! R- J. ^<P ><FONT size=2> <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>- a$ z3 z: w7 |# _/ w+ i3 h
<P ><FONT size=2> OICQ:30784290(难得糊涂)</FONT></P>
, u8 A4 Z: T; I p2 S' d! n6 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
|