QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>5 c: z0 @, R8 O! A" C6 ~7 L
6 j4 R, }! [5 O0 N7 I& U* R! u
<TR>
& I; N5 d2 f- E: Y7 E" K<TD width="100%">
" Z% F/ \- H# R$ u; H5 S+ n< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
3 K/ r5 O0 t. E& L<TR>4 T+ [* H: D+ s3 I, `. R
<TD width="100%"> </TD></TR>
4 \9 @" m6 G! T* v5 r<TR>4 Q- d" T4 B$ S% Q
<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:" R' A: j: B& j' d5 a: a, @
 </FONT>
& N7 n# f& b8 K. I! o6 z9 l< ><B><FONT size=2>1.安全性。</FONT></B></P>
$ ~; X% Z" k- O% u< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。0 v& i5 t- M  B0 c9 v' Y% b; Z
 </FONT></P>5 ~9 [* S! e/ d6 N  r- F; v) \2 K5 V
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
- W3 R- G' O+ t2 r< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。6 V  @" R& W: ^$ @9 u
 </FONT></P>; T) q4 ?* z+ @- m
< ><B><FONT size=2>3.美观</FONT></B></P>7 o! T* U, v. d; \6 A- V! w
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。- a5 u0 _, W) h7 _+ U) J" s
 </FONT></P>- C- a, w0 u$ t. U: A  C3 m
< ><FONT size=2>4.还没想到......</FONT></P>
3 g1 d4 C8 c' H, Z' t8 z4 E0 G# Q< ><FONT size=2> </FONT></P>
, x' T1 E0 W8 Q8 Z< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>" N3 |& f1 ~" [. a6 ]2 s3 z6 |0 |3 K( L6 O
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>0 ^' A- T9 z4 a# {
< ><FONT size=2>我想到的有以下几种结构:1 Y0 y+ q1 Z7 w! G) T' G
 </FONT></P>9 r/ a) ^' v8 {; u2 v% t
< ><FONT size=2>1.</FONT></P>9 v) p9 Y" Q2 ^
< ><FONT size=2>{</FONT></P>
! L5 O, f5 K8 g& Y9 i$ P; W: T/ u< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>: u# |2 e; Y1 x% a0 ?/ s8 S  ?
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>
+ R+ Z3 J: s7 }7 O2 J2 a+ u& t< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
- J- L+ |5 \. Y7 D3 S3 d' `' d< ><FONT size=2>    各个文件内容</FONT></P>
; h* z( b9 v* ]5 Y) U< ><FONT size=2>}3 f& A4 k# k6 s* ?. @. u5 K8 s
 </FONT></P>
; |  d$ J: U' _' @" }( O/ C< ><FONT size=2>2.</FONT></P>8 _6 k8 B/ ]# L" {/ A1 u: t; z& c
< ><FONT size=2>{</FONT></P>3 b3 r7 b. h6 ~8 @( I: \& u& s7 `
< ><FONT size=2>    文件标示信息</FONT></P>
- D, ~6 s1 L3 f, X, M< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
: i* b  s2 X! @. U< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
$ s1 G( r( ?+ v0 {# H% M0 o< ><FONT size=2>    ......</FONT></P>. i& P6 M! x) K9 \2 }  F& v! {! Q4 l
< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>$ V7 u8 \# |( n8 f3 l. ^! b
< ><FONT size=2>    (文件计数)</FONT></P>
( D3 I  d8 g. w$ m' X/ R- M< ><FONT size=2>}, z. L7 ^- a  p* T: e
 </FONT></P># T3 |" M' t* O  l. ]
< ><FONT size=2>3.</FONT></P>- P4 S6 R! s- V
< ><FONT size=2>{</FONT></P>
2 Q: ]4 n# |3 D3 {/ j( C8 r<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>+ _/ \4 l$ ~" Q8 [$ u7 p4 c
<P ><FONT size=2>}</FONT></P>
1 |* q- F; R/ P. O4 h<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
, I7 O% [& D1 r7 {3 G<P ><FONT size=2> </FONT></P>4 B2 p$ h$ h; F/ f
<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>$ @( [$ `5 R1 ^8 l6 H/ V
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
7 U; u: o# y) Q5 V<P ><FONT size=2> </FONT></P>: i) S/ G* j- @: u. H% E4 \1 r
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>8 ?6 a$ ?) }) m* F5 j- R
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
" c5 ~7 D: N) Q# v) g4 U* p* D( |<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之). z4 w) |+ p. X& ?4 ?3 h+ d
 </FONT></P>
1 U2 C+ {' g" K<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
7 ?$ o; X. I$ ]+ b. [+ e1 ?. d </FONT></P>
, p& {8 s6 i1 f<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>$ b, o" a, j1 i; g% l! B/ Y
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>; T- o; U! A8 V7 \5 r# j; a, U
<P ><FONT size=2>    {</FONT></P>  \4 J! z+ `7 P* F7 v- Q
<P ><FONT size=2>    #ifndef PACKER</FONT></P>
/ f' `3 v6 z* q( Y2 ~1 t<P ><FONT size=2>        strcpy(y,x);</FONT></P># {1 Y. T7 Q/ n, g& t& M
<P ><FONT size=2>        return true;</FONT></P>
. b; ^; }& ^: r6 Y<P ><FONT size=2>    #else</FONT></P>
! \2 i$ K, J6 _# Q7 X3 t<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>& J3 X7 X! x1 m- s3 a
<P ><FONT size=2>        否则,返回false</FONT></P>
% _& v7 ~& F. h% [1 A<P ><FONT size=2>    #endif</FONT></P>
# w1 w7 I. Y: v% n<P ><FONT size=2>    }! q( ]# [0 o( j0 _6 M! a. K
 </FONT></P></FONT>
* e6 \$ w) Y4 g% Y: C1 N4 B<P ><FONT face=Arial size=2>  程序中应该有如下片断* h6 m5 q+ O8 {# s5 k7 K' ~* H
 </FONT></P><FONT face=宋体>, y9 u. ^$ C- t0 {" ?. z
<P ><FONT size=2>    char szFile[256];</FONT></P>+ ?. g+ D! E  Y9 N5 Z" |8 }4 h/ [
<P ><FONT size=2>    CPackFile packer;</FONT></P>
( I% [( M7 {* i9 M1 ^& ~" P<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
: G: J9 ?% ~  G8 a<P ><FONT size=2>    ................</FONT></P>% r- N. x$ N/ k  `/ R/ g8 E' T7 U
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
' H/ m+ Q/ I1 }, ^& O. f* [2 J2 Z<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
! f1 A" m% c! V/ t( U$ ^6 w<P ><FONT size=2>    </FONT></P>; S3 r, s0 G5 O  k- Z5 g. _, o
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>! T) @) ~$ w3 k* \1 u6 L
<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
" T" F  |# Y2 @- V% W<P ><FONT size=2>  欢迎和我交流</FONT></P>7 q3 {+ c* h2 X  m$ q
<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>, A1 H) D2 e* z5 F% p
<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>
/ W" M/ D8 R8 ?2 v8 g0 a" e6 ^<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-7-21 02:48 , Processed in 0.427563 second(s), 58 queries .

回顶部