- 在线时间
- 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>
% u+ T' s) j, H0 b9 a i' _# Z# G5 X1 h
) x+ S# N$ ~# J( P% N/ l1 d8 j<TR>- t3 G; q7 K1 U) y1 k1 Z
<TD width="100%">
( ^: m* q% I& s5 G+ O% R; P# e4 ^< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>, I! Q7 J) x8 l$ I, u
<TR>; q6 M* C$ n8 x; ~5 h3 O
<TD width="100%"> </TD></TR>
, Z0 o" S- p% _$ j" L9 A8 _7 A<TR>
0 g3 e0 E" E2 Q4 S<TD width="100%"><FONT size=2> 打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
8 ~: R! x7 {3 u </FONT>
4 c( c$ W/ J/ I; ^) p! }/ g8 h$ c( ]< ><B><FONT size=2>1.安全性。</FONT></B></P>$ a1 ~3 W9 ^0 P; w+ L$ x
< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
) _) N1 z2 t5 T0 A </FONT></P>8 u) K* G0 R7 a8 o
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>3 w5 w9 \; m. t+ P4 P. ]" T5 S i5 n: J
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。 n! R' o9 O6 ~7 `" n( P- G
</FONT></P>
" O/ J7 g+ ^3 |3 ^7 q< ><B><FONT size=2>3.美观</FONT></B></P>
8 n5 q" A) ]2 @< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
* `/ ~8 h! v. m' G0 \9 X K </FONT></P>
' }$ l8 S/ [& c! x( k6 B6 U$ z< ><FONT size=2>4.还没想到......</FONT></P>% {- ?3 k) I7 @ k; I# L7 S
< ><FONT size=2> </FONT></P>
* k' a' X: x e* \5 S+ P< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
9 V. m/ ]2 }0 E6 z/ Q$ M- V< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>, P: d% Z+ i! L6 ` L9 Y
< ><FONT size=2>我想到的有以下几种结构:
% T, J; `# t' B </FONT></P>! F1 o; \6 ?5 v( m! I
< ><FONT size=2>1.</FONT></P>! j4 @; L/ V) ?8 f5 T; S
< ><FONT size=2>{</FONT></P>
% a; U) r- a' q' |< ><FONT size=2> 文件标示信息 //判断是否是正确的打包文件</FONT></P>& P+ }* ^5 W4 n; N: ^1 i
< ><FONT size=2> 文件的个数,文件索引表大小</FONT></P>
2 G) q! T I! S! B3 j. [- _ _6 X< ><FONT size=2> 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
+ c- e2 f- ^% J0 L; M< ><FONT size=2> 各个文件内容</FONT></P>
+ p+ `8 d8 Q& y0 G( K< ><FONT size=2>}
, T& q3 S0 o, B </FONT></P>; ]3 S- a% e% ^ k3 _; Y: o6 ^7 Z
< ><FONT size=2>2.</FONT></P>& h4 m& p1 R* W" {* t$ L
< ><FONT size=2>{</FONT></P>. m7 }$ l1 q, W$ {
< ><FONT size=2> 文件标示信息</FONT></P>( W& |4 B& {0 l! ?, S! P! K
< ><FONT size=2> 第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
0 h* @' s2 c. [- r< ><FONT size=2> 第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>& C+ @. ^2 T* e& ]) m9 V2 b( S8 E
< ><FONT size=2> ......</FONT></P>
% [7 C1 T, F8 C< ><FONT size=2> 第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>9 C3 m# m" D6 g
< ><FONT size=2> (文件计数)</FONT></P>
: O7 o6 X9 T8 Z' O `. e6 [< ><FONT size=2>}
; g- ?4 d6 z3 T4 E/ O: w3 X6 C </FONT></P>) Z; z8 P4 \6 M" J# ?, P
< ><FONT size=2>3.</FONT></P># O6 j+ C( |; S- X
< ><FONT size=2>{</FONT></P>
' f& O2 J! t5 f/ @" D<P ><FONT size=2> 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>2 F% m1 h0 v3 C0 h/ n E; ~
<P ><FONT size=2>}</FONT></P>& ]$ x8 s9 k: ?% p
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
5 c; _& q5 [! F0 d( A<P ><FONT size=2> </FONT></P>
0 e/ C( `; Z, _! _ q% ?<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P> ]0 x; F4 p2 V( z1 Y" o7 l
<P ><FONT size=2> 解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
5 O) v4 ?9 Y* F7 R<P ><FONT size=2> </FONT></P>: Z1 m& z/ M* q! _' j, G% B0 }
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>* N0 N h) C1 g( }7 ]7 d
<P ><FONT size=2> 最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>2 u8 w( Z+ J8 P) U0 O! I3 q
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)7 f: A( s& X' ~" L
</FONT></P>
- e3 b6 ?' t6 m* \/ ]6 }' g<P ><FONT size=2> 在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
; _3 ^" c. P( x7 a# ~ </FONT></P>) l( B# t4 H# R8 D
<P ><FONT size=2> //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>6 {1 {2 `4 ?7 J
<P ><FONT size=2> BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>6 ?, U5 ?. F$ v; J+ a3 v
<P ><FONT size=2> {</FONT></P>4 B( S; z2 b l c% X3 |9 Y
<P ><FONT size=2> #ifndef PACKER</FONT></P>
; P$ ^6 r; X/ ^$ W3 |<P ><FONT size=2> strcpy(y,x);</FONT></P>
6 G. {6 W' n( r% \/ V<P ><FONT size=2> return true;</FONT></P>
0 L4 k/ ?$ h; ]6 u3 W# N9 N<P ><FONT size=2> #else</FONT></P>
9 N/ D" \* m" q' d<P ><FONT size=2> 在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>& c# e' ~9 K) x2 f( p$ I
<P ><FONT size=2> 否则,返回false</FONT></P>7 X* o3 L; D# @( h9 ^( X
<P ><FONT size=2> #endif</FONT></P>* |) x$ }/ u" q0 B8 q. ?
<P ><FONT size=2> }
0 _; I: x. U9 Y% y+ `0 Z </FONT></P></FONT>
( }9 h7 L3 t. b* l6 [# |7 G) X<P ><FONT face=Arial size=2> 程序中应该有如下片断4 _) H" t7 x! f3 ~0 F
</FONT></P><FONT face=宋体>
+ K) b0 O, [' C6 z( B W' `# N<P ><FONT size=2> char szFile[256];</FONT></P>2 d5 C2 T" H& |$ R
<P ><FONT size=2> CPackFile packer;</FONT></P>
/ S2 k! i9 d' i$ B8 n7 B<P ><FONT size=2> packer.OpenPackFile("somefile.pak");</FONT></P>3 C% T( O+ P6 U& ~ O
<P ><FONT size=2> ................</FONT></P>
4 @! V8 h# ^+ @0 B<P ><FONT size=2> if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
7 R9 L& C, w" u3 A. v2 P" K<P ><FONT size=2> do something....</FONT></P></FONT><FONT face=Arial>
7 S) i! V8 s: d) N$ C. N<P ><FONT size=2> </FONT></P>
+ J( H3 U. ^* e6 ~6 R<P ><FONT size=2> 下面看看我的具体程序吧!</FONT></P>
9 C' e* f4 q$ k3 e C<P ><FONT size=2> <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>/ N/ B# T4 q' x/ b. r
<P ><FONT size=2> 欢迎和我交流</FONT></P>- `# X6 d+ Y$ v7 K8 @
<P ><FONT size=2> <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>. x8 v3 H4 S5 q
<P ><FONT size=2> OICQ:30784290(难得糊涂)</FONT></P>
: D8 W* U4 g6 P# L. 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
|