QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3920|回复: 1
打印 上一主题 下一主题

[转帖]游戏中的资源打包技术

[复制链接]
字体大小: 正常 放大
xShandow        

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>
+ ~! r1 v7 ^9 o: }% y1 T& I2 v
/ [1 r# M& G& O- e2 n<TR>
3 e* O( I: w% s0 _<TD width="100%">' v7 X0 G7 d2 l4 q0 D2 D
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
& j' ?6 Q: N  v) G! C<TR>
' |# D- M: L. z# N<TD width="100%"> </TD></TR>0 ?  N2 B* ?; W
<TR>
! U- ^6 u& |/ l" z6 {9 l* X<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
. b- j' B$ X1 Q3 P5 K. Y5 i </FONT>
! N( Z- ?- J  C# X. g" {: H! _< ><B><FONT size=2>1.安全性。</FONT></B></P>5 g0 ?. Y$ Q9 ?6 j9 @0 B% c
< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。# |' M! x8 a, C) X) o( x! X
 </FONT></P>* s* F% V6 R: l6 v
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
# j' x* J8 `- X. @  {+ w1 S< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
$ M0 x+ {. t% s6 V  n/ ? </FONT></P>) x! U! I( M! @9 x3 D/ q
< ><B><FONT size=2>3.美观</FONT></B></P>
1 L6 t/ @8 s" n% x; T< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
* c0 P: r1 u5 }) t( J" U </FONT></P>  [, M8 d3 i: m& u4 d# s6 ]
< ><FONT size=2>4.还没想到......</FONT></P>3 m4 C* i, f1 ?) J1 S8 b# B6 D5 B: Z
< ><FONT size=2> </FONT></P>
, I* B/ h* S4 v  b$ o2 x< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
" i8 Z! F6 {" ~< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>  X* I: F9 `6 b' Z
< ><FONT size=2>我想到的有以下几种结构:
6 F# [- f8 @' _* G, ?3 U </FONT></P>5 c# X+ C, s" Q2 z+ f% z1 v' ~
< ><FONT size=2>1.</FONT></P>& K" X5 k4 U4 n7 u0 q! C5 y% X
< ><FONT size=2>{</FONT></P>+ }9 n' @7 j+ ?. r
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>
1 u  f- {: D  \7 y' r* G8 J9 B< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>
! f: [( w! G9 t< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>/ f  `/ u+ g' v3 y
< ><FONT size=2>    各个文件内容</FONT></P>
, v+ ^7 H: {0 F! Z& t- n< ><FONT size=2>}
) ?9 P+ E9 f/ b* J) V/ o </FONT></P>9 X7 S) Q$ N( ?8 W2 E
< ><FONT size=2>2.</FONT></P>
: A; ]8 _& p, j; n; Q! M< ><FONT size=2>{</FONT></P>' U1 H8 q& U6 [) l( p
< ><FONT size=2>    文件标示信息</FONT></P>
  d' [4 L; x* {) W, R2 d3 o: {< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
4 Z9 l: p- x. |7 g7 j< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
/ Z; P1 {9 k* Y/ [1 Y2 e< ><FONT size=2>    ......</FONT></P>
  P; j8 y0 q3 B& l9 [: r7 w  S3 ^( c/ I< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>9 ~" C- \- ?2 E. U, t3 o
< ><FONT size=2>    (文件计数)</FONT></P>" d" E2 J. V- R7 J3 n
< ><FONT size=2>}
9 P4 H. y9 a5 y </FONT></P># I. M. G5 W( j6 V3 _
< ><FONT size=2>3.</FONT></P>
" @3 k4 g. D7 _, f1 [< ><FONT size=2>{</FONT></P>
0 H8 `! `& M8 h0 W* K2 r9 a4 T<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>* s6 N4 Y9 O" p: C, r2 j0 V
<P ><FONT size=2>}</FONT></P>
# d3 @: w( V3 ~* c<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>1 K- O  \( {: T7 h+ c$ ~0 N& ?
<P ><FONT size=2> </FONT></P>
2 X: E/ g. B# I; T- T9 ?0 P<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
/ g4 @; \; K! s5 K4 \0 c<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>- H( Z$ j: V# K9 }
<P ><FONT size=2> </FONT></P>
- u, ?& G5 `2 n, h. ?" U) _4 U<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>
+ ~% T: f! h; c' L8 r<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>* g' O) l" d. T
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)2 n* ^- I3 Y; u. [' z' W- l
 </FONT></P>
7 D0 ], d1 r6 M2 ]& v) }" j; `0 U: y<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构7 l( s$ I) v8 l' x4 A! z
 </FONT></P>8 n/ r, {8 y2 m" h
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>  [7 g) X7 J  Q  j6 v
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
0 @7 ?3 m- @' l" a) N% Y<P ><FONT size=2>    {</FONT></P>
' I* R' \* f) t- F: o<P ><FONT size=2>    #ifndef PACKER</FONT></P>- d' v% t4 ]6 @( M- Y0 u* ]
<P ><FONT size=2>        strcpy(y,x);</FONT></P>- N  h' h; `2 g4 Q" O0 G" l% v
<P ><FONT size=2>        return true;</FONT></P>! _+ y* i( b. g& d5 [
<P ><FONT size=2>    #else</FONT></P>
5 r$ U& x) ?1 \, s<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>
* V3 c! }$ ~" d" }: Y<P ><FONT size=2>        否则,返回false</FONT></P>
" V4 x- k; A4 ^+ P<P ><FONT size=2>    #endif</FONT></P>
  h$ L* ?3 \8 {5 C0 {4 O& n4 d  m<P ><FONT size=2>    }% f5 k) z0 q( C( r" s
 </FONT></P></FONT>
1 a6 c4 ~% J$ I4 R+ P<P ><FONT face=Arial size=2>  程序中应该有如下片断6 U' u9 c, ?. ~/ g* F3 N
 </FONT></P><FONT face=宋体>1 j- [6 t* L6 R& q
<P ><FONT size=2>    char szFile[256];</FONT></P>- k  Q+ \. @6 S: O9 K4 a
<P ><FONT size=2>    CPackFile packer;</FONT></P>  C: M, p5 O' @" ?
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
% w$ \6 i' M  x" ^<P ><FONT size=2>    ................</FONT></P>7 s$ [2 d& F$ k6 Y; Q" \
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
# s% ^* N! Q3 n% c# t0 ~( k<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>+ j" e" u. @& \! F
<P ><FONT size=2>    </FONT></P>
/ @5 `) _- m, b6 H  Z) I$ y<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>9 ~% K2 }0 ?- M2 }
<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
7 u' m# c: e4 X- t4 U$ X( I<P ><FONT size=2>  欢迎和我交流</FONT></P>
& n6 ?: @1 m; K; b; e<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
% A7 I) S, a) \& h2 t6 ~9 d; k<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>4 q$ g: k* I2 f, y' h
<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
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
ppooiiuu        

0

主题

2

听众

166

积分

升级  33%

该用户从未签到

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-11 07:25 , Processed in 0.330977 second(s), 58 queries .

回顶部