QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>+ Z2 T# I2 C* a7 i

3 B' ?. F; y/ ~<TR>
* [0 |1 w( g$ W  O" L/ s/ O<TD width="100%">
0 E1 g# P; C3 L  u$ r< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>( \0 _8 f- L# T8 v$ J' @  S9 W" U
<TR>1 g: u2 c7 G! U+ D, \' Y2 Y1 `
<TD width="100%"> </TD></TR>
$ K) _/ g, T$ ^6 {<TR>7 L5 J% m: m# f2 O8 J9 R, W
<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:' z3 K4 M3 ^+ j" g
 </FONT> . \! `  K; A) |* X6 L3 s6 K
< ><B><FONT size=2>1.安全性。</FONT></B></P>
& G9 [$ X2 ]* `* g1 P/ q" z2 n2 S$ t< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。" C- r- t2 }& q
 </FONT></P># J3 G4 y, a! ]. p7 p1 Y( |# C  I
< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
2 _! t" ?& d: r< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
9 v% }+ O0 }% l% z </FONT></P>
' I- w8 v# q! H< ><B><FONT size=2>3.美观</FONT></B></P>' K6 r+ \8 C# T" W. H2 G+ [& g$ n
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
% c% P' l/ x" e5 v  p </FONT></P>0 U! u% @/ R6 s- @6 I
< ><FONT size=2>4.还没想到......</FONT></P>
! I8 g# a) w' j8 B  p1 C/ f/ w; e< ><FONT size=2> </FONT></P>2 Y. e, i3 c: T1 L+ _
< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P># c# e  k; e; v; R& R, L
< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>3 k6 C/ k" S  ~- J
< ><FONT size=2>我想到的有以下几种结构:
1 q) ?* e7 C9 J7 {2 V </FONT></P>
. g1 B: n% ]0 y% _+ r/ B  h  q< ><FONT size=2>1.</FONT></P>$ Q: e7 T. v3 }5 ]. r. E
< ><FONT size=2>{</FONT></P>
) S& c# S8 y# ?+ y< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>, O& j: v) }; a/ u. i
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>
7 w2 y3 K. G- q6 [< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>* P& b" U& d' M+ C9 {
< ><FONT size=2>    各个文件内容</FONT></P>
4 E( n# A6 M9 `) e< ><FONT size=2>}
$ ?7 @( G) g8 H </FONT></P>
; J* }: s( _! g2 J" n/ ~' K1 R< ><FONT size=2>2.</FONT></P>1 u' M  C7 i! n" ]$ w' J$ X# N1 |
< ><FONT size=2>{</FONT></P>
: ~7 }7 F6 d# c& ]$ E% D: q< ><FONT size=2>    文件标示信息</FONT></P>
2 q. U) @3 q: c( B* B6 a< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>
8 ~2 C: l) g& O# z+ \< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
3 e9 q# Z2 L; L# o" L5 w, f' n< ><FONT size=2>    ......</FONT></P>
( K/ A0 O' k, z< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
* u( d' \7 ^1 ?" {< ><FONT size=2>    (文件计数)</FONT></P>
2 ?9 k% P2 O" D* m7 u8 ]< ><FONT size=2>}
' H* @; |* z. y3 G4 G9 U4 U </FONT></P>, ?0 \4 K+ ?( {; p3 p9 V2 ^
< ><FONT size=2>3.</FONT></P>- i  T0 x! a+ _- X- e
< ><FONT size=2>{</FONT></P>
) L" Y( N7 `( @<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
) `+ @* s. r1 p" K  [3 u<P ><FONT size=2>}</FONT></P>
- n- V  t. K8 k; L0 b<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>  g$ ?8 u9 B) u5 {- ]
<P ><FONT size=2> </FONT></P>
8 ~7 N( [: ^! N/ c5 o4 h( M& X) ~<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>) c. g" Y" R% E9 S' N, M
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>- L2 C. e1 [( ^
<P ><FONT size=2> </FONT></P>
' h3 T9 M6 H0 b' x/ O) U. }<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>+ B6 y1 \! U6 K- ?
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
: `6 [! l* F* o6 Y; h<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)! u( C8 C- @8 i& u
 </FONT></P>% \- s1 l6 j) G$ f! y- k
<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
: Y) E/ R% i8 p8 s, B% V2 F2 }& O, i </FONT></P>& t3 R, u) X; k4 g, y5 s3 o" v& A* V
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>
  K3 p6 H8 z. t<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
2 e+ r6 B8 g# }<P ><FONT size=2>    {</FONT></P>
( I0 y) q0 P! ~1 J0 g/ D<P ><FONT size=2>    #ifndef PACKER</FONT></P>2 l3 n+ h! `% k$ ~" K8 {6 Y
<P ><FONT size=2>        strcpy(y,x);</FONT></P>6 I" T  v/ f4 w9 b( _& m# {
<P ><FONT size=2>        return true;</FONT></P>
/ c0 M* p! n+ z! H+ t<P ><FONT size=2>    #else</FONT></P>& o9 l# ~) Y5 m' F: Z: X! `* n/ u) @
<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>" B- f5 B4 t7 c; v6 y/ t: G  o
<P ><FONT size=2>        否则,返回false</FONT></P>) x# M, x8 j7 n+ ~3 k; T
<P ><FONT size=2>    #endif</FONT></P>" p, T! a. i' ~9 ^6 X
<P ><FONT size=2>    }% q5 x3 M5 w/ b/ O$ {: |+ g
 </FONT></P></FONT>
  `$ t# F& z9 y* {" N2 i, {<P ><FONT face=Arial size=2>  程序中应该有如下片断5 p+ P/ X+ c! q/ r7 v0 f
 </FONT></P><FONT face=宋体>
" A- d) S! Z/ c3 G5 ^$ D9 k0 C3 ]<P ><FONT size=2>    char szFile[256];</FONT></P>" b/ o: @0 q) E4 B- y- w4 k0 i% U
<P ><FONT size=2>    CPackFile packer;</FONT></P>' [) @, ?$ m# m2 r
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
5 i7 Z" `( [/ [; H<P ><FONT size=2>    ................</FONT></P>
! l- M# f1 T6 h7 g6 v  V) _+ L<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>, U5 l& x  \' t# @/ b0 f
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
. G  T* s  E% X3 j" |$ ^1 j<P ><FONT size=2>    </FONT></P>8 {- l, k" s1 I6 j8 A6 F: f& m
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
9 d; b& V4 y, ?% v7 `* ]( b9 K; Y<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>: B, r7 J0 ^" C! ]! I0 }* D
<P ><FONT size=2>  欢迎和我交流</FONT></P>
3 g3 w8 c# `7 P" f  b' [<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
2 M3 N! t6 E) i/ R% c. }<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>  H# X2 a6 E* B: H5 f" B
<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-10-29 01:35 , Processed in 2.363231 second(s), 57 queries .

回顶部