- 在线时间
- 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>; ?, p- p4 |; P9 v/ D
) c- \9 j+ r% T
<TR>( }' D+ l9 a, { L9 j+ F
<TD width="100%">- p* Z* [3 O: T$ i4 j
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>$ P, ^1 L9 R9 O7 m
<TR>
6 J" B& M" e# J8 y! |8 U( k<TD width="100%"> </TD></TR>
" }$ M% j% `, M3 ?<TR>* z! L" I; L& G' {( L
<TD width="100%"><FONT size=2> 打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
. @" r# a. q) q. Q$ S </FONT>
( q* s: `6 J, g3 J< ><B><FONT size=2>1.安全性。</FONT></B></P>
, ]! F8 {, C1 s1 q3 @< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。: G1 b0 }/ l- U
</FONT></P>5 E0 W$ R) a1 r$ [4 I% j- S
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>7 A: {- g8 z: S( L
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。. R9 F" \9 k: E
</FONT></P>( }* |' B8 L3 K8 r
< ><B><FONT size=2>3.美观</FONT></B></P>) [% N; C% k7 {
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
( |5 h7 I6 T h9 c. p2 M+ V! z </FONT></P>- P' c, g, D: u
< ><FONT size=2>4.还没想到......</FONT></P>
% v+ B: N$ C* r# J. C< ><FONT size=2> </FONT></P>
7 E. P) r7 K) [; ?; e0 r< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>% a Z9 X' ]# L0 _# _& j2 W& \1 [
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
; q1 g) X2 P8 Q2 ?' p$ H0 v< ><FONT size=2>我想到的有以下几种结构:
8 C7 g& s2 g | </FONT></P>
8 b9 Q; \. c' e o5 @: [. Z! q6 [# K$ Z< ><FONT size=2>1.</FONT></P>
) @1 s2 g6 E% }% [* i< ><FONT size=2>{</FONT></P>4 p" k* D) A, Y9 r2 s: r
< ><FONT size=2> 文件标示信息 //判断是否是正确的打包文件</FONT></P>
! B4 V4 x& \9 r, D' A6 i9 b! _. B4 [4 E< ><FONT size=2> 文件的个数,文件索引表大小</FONT></P>
, u7 i% C4 R3 ~) a! |, ]< ><FONT size=2> 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
6 t; e# B3 Y" }. s8 _< ><FONT size=2> 各个文件内容</FONT></P>
o' o& X% H" [5 r8 {' _< ><FONT size=2>}& ?. t* s( `' R. Y( s9 h3 p$ p
</FONT></P>
; J( t- [3 Q* K) M4 k' p0 q< ><FONT size=2>2.</FONT></P>
7 E$ W1 V3 Q( G0 u2 s< ><FONT size=2>{</FONT></P>& H, J8 [# [: P a; z, N
< ><FONT size=2> 文件标示信息</FONT></P>
/ ]3 {: M' C: B" `& l; E< ><FONT size=2> 第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
\7 h7 f/ ?0 S# q- m' z1 K- d< ><FONT size=2> 第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>+ C: Y4 S$ W4 x# o
< ><FONT size=2> ......</FONT></P>
8 o& j8 f) v2 q$ ~! l' l. J ]6 L< ><FONT size=2> 第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>- z6 j+ m+ c W6 ~3 }- E+ S
< ><FONT size=2> (文件计数)</FONT></P>0 B0 e, b8 p9 Q3 w0 `3 H) k
< ><FONT size=2>}
% E. O+ a: e$ y </FONT></P>" B2 \( W( |5 Q) d8 ]: f+ M
< ><FONT size=2>3.</FONT></P>
6 P0 }. V" @1 I4 v< ><FONT size=2>{</FONT></P>4 X% p! A9 I2 X, W
<P ><FONT size=2> 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
( k7 K$ [: G) a9 c<P ><FONT size=2>}</FONT></P>) Z1 b; v" [! j* b2 |) q8 _
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>: B# T5 I) ]# `
<P ><FONT size=2> </FONT></P>
- x0 t) {$ D/ v# n! \. Z<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>1 g4 k/ s# T* a( m$ Y
<P ><FONT size=2> 解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>8 U" E/ A7 g' r7 g, i- o& W
<P ><FONT size=2> </FONT></P>6 Q2 j7 V3 \: d) N/ }4 p* ]
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>
9 _7 Q+ e& i: R' L, R; Q2 v. j* N<P ><FONT size=2> 最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
: C6 e; ^% d. s9 i! ~9 F5 E6 x<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)) ^" [% Q# I/ b$ G r: A( {( n* \
</FONT></P>
' B8 P' a- L- F8 e! ~<P ><FONT size=2> 在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构3 m6 H m Q/ M% Z' B
</FONT></P>
3 |1 X( |- G8 L' l3 I! k<P ><FONT size=2> //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>) A; s) p( H I7 v* e
<P ><FONT size=2> BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>9 p5 M& B& O, k0 m6 G% z) f2 Q/ ^ @
<P ><FONT size=2> {</FONT></P>% A6 L5 F) `" m+ S# c3 a
<P ><FONT size=2> #ifndef PACKER</FONT></P># i( r N* {0 S/ z' n2 Z
<P ><FONT size=2> strcpy(y,x);</FONT></P> @3 y D$ ~+ P
<P ><FONT size=2> return true;</FONT></P>; R6 [7 }4 Q# |' n$ \7 ]) ~( [
<P ><FONT size=2> #else</FONT></P>
& I- B& b2 b1 ?5 A9 A$ v$ I<P ><FONT size=2> 在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>' Y# @$ l% k% N! g! p/ }
<P ><FONT size=2> 否则,返回false</FONT></P>
& x/ e7 b5 u2 C$ c' Q( e0 o! @<P ><FONT size=2> #endif</FONT></P>0 T% F6 W! T- Q
<P ><FONT size=2> }; H" K" W# L* |& }. Z
</FONT></P></FONT>
7 u* h* ^5 A2 h: k<P ><FONT face=Arial size=2> 程序中应该有如下片断9 \1 j# Y* |% T8 Z
</FONT></P><FONT face=宋体>
$ r4 b5 s5 }0 l1 B# f1 k<P ><FONT size=2> char szFile[256];</FONT></P>
: Z# ?; J5 V5 |% j3 e) b) H<P ><FONT size=2> CPackFile packer;</FONT></P>
$ y; R' k( @. |& u4 W, N<P ><FONT size=2> packer.OpenPackFile("somefile.pak");</FONT></P>
& w0 @3 q& ?" ]- B<P ><FONT size=2> ................</FONT></P>5 T9 U |+ V5 T% e0 y; X! k
<P ><FONT size=2> if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
4 Y& ^# H( H. D% O" i4 |6 X<P ><FONT size=2> do something....</FONT></P></FONT><FONT face=Arial>
: a; T8 i1 P5 D% r<P ><FONT size=2> </FONT></P>
* v5 P0 R- i) R! \4 o1 Y<P ><FONT size=2> 下面看看我的具体程序吧!</FONT></P>
, X `3 H" ]2 n" g& |<P ><FONT size=2> <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
: z) z) E5 r4 R: N, ?$ `<P ><FONT size=2> 欢迎和我交流</FONT></P>
% F% a0 t6 I: y4 p' a" l Y<P ><FONT size=2> <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
: Y8 N4 g9 k# b<P ><FONT size=2> OICQ:30784290(难得糊涂)</FONT></P>
& P0 x+ @- G0 x3 H7 ]' f& \& k<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
|