- 在线时间
- 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>
& e" i+ d4 {! m3 H* F
# g8 h, Y/ n# [8 L<TR>
. [7 I J5 J9 q% v+ Z" t. M$ x<TD width="100%">
* M/ K6 O7 }- B0 P9 E6 A< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
$ [; a. ~8 y7 V<TR>/ q, m; L+ w" ?3 ^6 U/ C7 k
<TD width="100%"> </TD></TR>
! p r% V L* ^8 b G% R0 H V<TR>( ^& C3 b: m+ S& H6 Y
<TD width="100%"><FONT size=2> 打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
& ?& E- p/ J: p- O </FONT>
* w2 e# G' w- Y< ><B><FONT size=2>1.安全性。</FONT></B></P>
" `1 W! s W' Z8 ~< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
1 G8 l- b9 s( w- B+ S5 N </FONT></P>3 G9 p: q. a3 u6 r3 }1 y' ]
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P># W* x7 \8 d6 U; P' ~4 @
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。. l$ X ]& b2 P' l! Z
</FONT></P>
9 h' o3 c5 u% y0 L< ><B><FONT size=2>3.美观</FONT></B></P>
# ]& T% ~8 x5 E: [, I+ k& s9 n< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
% q* m; I ]5 y0 k </FONT></P>
. p3 c3 R7 P9 p7 T9 j$ L< ><FONT size=2>4.还没想到......</FONT></P>1 }7 A- ^; E6 W% O& n: l
< ><FONT size=2> </FONT></P>
4 B- ]9 R U$ R- x9 C7 a< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
L7 ]1 x8 A9 a< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
$ y$ X/ L% j& W< ><FONT size=2>我想到的有以下几种结构:
4 G3 i$ _/ M5 L- [- x </FONT></P>/ ]* ~8 ]6 I7 v) p% X- x
< ><FONT size=2>1.</FONT></P>
5 {/ `1 q b+ E8 o. C! s* k< ><FONT size=2>{</FONT></P>( t$ i# S. h. o0 P' D+ T; Z S7 k. S
< ><FONT size=2> 文件标示信息 //判断是否是正确的打包文件</FONT></P># U' I/ ]2 U' x$ m9 L
< ><FONT size=2> 文件的个数,文件索引表大小</FONT></P>( `9 x( ? R" x4 n
< ><FONT size=2> 各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>4 y9 n; s3 i, @& k
< ><FONT size=2> 各个文件内容</FONT></P>
: i# P3 C1 ^4 _< ><FONT size=2>}# c* ]/ Z6 Q/ l4 W" |4 ?0 x- x
</FONT></P>
. R* n- G. k0 d< ><FONT size=2>2.</FONT></P>/ l3 o4 h' O* T" O, R$ Z2 G! S+ S
< ><FONT size=2>{</FONT></P>
' f$ u/ r& F( s# P# z5 Y< ><FONT size=2> 文件标示信息</FONT></P>
- A( b* b" k5 ?6 k" R# K# ], q< ><FONT size=2> 第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>% b4 i- l! k8 c* L7 ^# @% B
< ><FONT size=2> 第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
6 B3 J$ R8 {3 Z1 K4 n$ Y< ><FONT size=2> ......</FONT></P>$ ?# W$ {* {3 \* h$ ]/ m! a$ ]5 |
< ><FONT size=2> 第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
, z- C4 a) K# c* V/ }2 I< ><FONT size=2> (文件计数)</FONT></P>/ o0 p& s3 B x" P6 X
< ><FONT size=2>}& e$ z! u" G1 N2 j" K
</FONT></P>
& l9 ?! Z6 U! l' e! M/ ]< ><FONT size=2>3.</FONT></P>
. q' M# x5 a; T. f) `< ><FONT size=2>{</FONT></P>% Y6 [; C4 Y( H& q
<P ><FONT size=2> 打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>, u9 ?/ F5 j$ g: x5 O' m
<P ><FONT size=2>}</FONT></P>
. e! r$ G3 N& |) q' S: `<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>: E0 a7 [( ^* r3 z4 s
<P ><FONT size=2> </FONT></P># L* P! F$ {/ v' C+ h: e* A
<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
& U4 n4 \8 @# }<P ><FONT size=2> 解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>! u! e$ s4 d: U M$ ]8 U4 s$ q d
<P ><FONT size=2> </FONT></P>; @! r* |7 O3 T c
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>
' W% w+ j$ A9 @% Q, a6 J( g! s' [<P ><FONT size=2> 最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>; ?+ R! o( }+ M" J+ h, M
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)
* O2 P' ?" P$ ?: D9 f7 v </FONT></P>0 b$ s/ A+ e R& K3 U1 k
<P ><FONT size=2> 在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构: X7 \" e% E1 N# a% U
</FONT></P>
+ P8 ?" _% \+ a- y<P ><FONT size=2> //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>: J( }# w; s$ j8 g/ E
<P ><FONT size=2> BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
# ?8 R8 q& V- |' n I<P ><FONT size=2> {</FONT></P>
: R% E: W/ F, `* r8 t/ z3 j8 } e<P ><FONT size=2> #ifndef PACKER</FONT></P>
, c% D/ Q) J, L- B/ L<P ><FONT size=2> strcpy(y,x);</FONT></P>( C3 v) T! G, i
<P ><FONT size=2> return true;</FONT></P>
$ y' M% t/ a7 `3 x" E<P ><FONT size=2> #else</FONT></P>
' v/ P* {( B h, w% [<P ><FONT size=2> 在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>! H4 \( V, L& p4 O- h8 l
<P ><FONT size=2> 否则,返回false</FONT></P>
/ g: T) ?5 Y& w! c/ E: L<P ><FONT size=2> #endif</FONT></P>
0 {) z' _* I% B0 d' v5 J$ M" l<P ><FONT size=2> }
7 F/ l- V9 ]9 ^1 S' ]2 E </FONT></P></FONT>; s9 E1 U2 G- z1 J+ ]
<P ><FONT face=Arial size=2> 程序中应该有如下片断
! V+ L3 A9 o4 Z2 K5 _( J, ]! p( y$ z </FONT></P><FONT face=宋体>* i; s J8 S5 m* T- T
<P ><FONT size=2> char szFile[256];</FONT></P>
: x9 i$ j2 X$ a; c2 E; X<P ><FONT size=2> CPackFile packer;</FONT></P>
- c2 H9 w" ]# Z, ^) M+ S: w9 L5 w<P ><FONT size=2> packer.OpenPackFile("somefile.pak");</FONT></P>
# i% A& e/ D5 k$ F5 ~<P ><FONT size=2> ................</FONT></P>* b+ n7 L9 H# |% Q
<P ><FONT size=2> if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
' D# X! q+ S8 E+ P# \& g1 y# e" v<P ><FONT size=2> do something....</FONT></P></FONT><FONT face=Arial>
3 }$ |4 B1 W r! G: U<P ><FONT size=2> </FONT></P>
3 Z* b0 T, J9 a/ l9 \* `! c<P ><FONT size=2> 下面看看我的具体程序吧!</FONT></P> F! \0 s$ M& q3 A: k
<P ><FONT size=2> <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>0 T5 y+ s' M7 H$ W7 |
<P ><FONT size=2> 欢迎和我交流</FONT></P>
( @' u! Y8 C- N% I4 m1 q0 k7 J- Z<P ><FONT size=2> <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
% J" Z# O" _, U<P ><FONT size=2> OICQ:30784290(难得糊涂)</FONT></P>
! w5 b- L( p$ e; x1 @: z+ G<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
|