QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE># ?+ X+ A/ X$ n! ~
+ C0 H0 Q5 _% Y6 k1 f4 }
<TR>: ~. ?  T" l; h7 |
<TD width="100%">
$ D& c4 v3 ~* C4 L. t; W2 [, b  t( V< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
6 s1 O" h6 v5 j0 e! k6 c3 N( o<TR>% I! O: R6 v# t2 [0 G. [: `+ ?
<TD width="100%"> </TD></TR>0 F- V/ E  t; q
<TR>( i$ {0 C6 S3 }( u# P
<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:0 b0 }2 ~+ w- o. Q9 `
 </FONT>
0 b9 {5 s0 i8 T< ><B><FONT size=2>1.安全性。</FONT></B></P>
# t0 Y' Q1 `; M< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
6 x, \& L; ?7 D4 d9 T* m </FONT></P>
  [. D+ m( n7 [: C3 W6 a0 T0 a< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>) f2 q! A0 O! u1 K
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
$ B: n; a( f6 L* w, g  J7 ^3 k* H </FONT></P>
% o! F% |' W# d9 q. c; ^< ><B><FONT size=2>3.美观</FONT></B></P>
7 j- e6 F2 ?' L( @0 b7 D, }< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
7 L- b( L# v  E7 ]# \5 j </FONT></P># v% g) o+ y% ^+ Z( O
< ><FONT size=2>4.还没想到......</FONT></P>( t& y% A! R4 k  i
< ><FONT size=2> </FONT></P>
/ k# T) n5 `, F( H) q< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
1 k$ o6 O0 z! d< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
5 R  x  @, `3 ^3 \6 k8 B< ><FONT size=2>我想到的有以下几种结构:
) j/ _: j6 x9 l" e </FONT></P>
) Y$ `0 Y1 O6 b1 Z5 K4 j< ><FONT size=2>1.</FONT></P>8 t& Y# u2 S  U
< ><FONT size=2>{</FONT></P>/ ^" y: C% b: x; X3 U, a
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>, O, |" @+ F3 D. Z# t
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>
. U( @7 e  D; o- u* g1 s' R< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
3 ~2 S( F) |! I5 j3 C+ F, g) G< ><FONT size=2>    各个文件内容</FONT></P>
* W# E" g/ ?( {< ><FONT size=2>}4 E" P- g2 E2 v2 N& o
 </FONT></P>0 x" W, T' |$ O' ^8 X: i
< ><FONT size=2>2.</FONT></P>! h0 e7 `: N$ m8 H% F: h. n7 V
< ><FONT size=2>{</FONT></P>' s3 u" W" g* `& H9 E
< ><FONT size=2>    文件标示信息</FONT></P>( x2 a9 n, L+ ^9 J  {6 P
< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>6 `. V6 f5 R% J1 X7 L
< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>3 ^9 [. J* H2 w" ^6 e! E
< ><FONT size=2>    ......</FONT></P>
( D5 j/ I. t6 K; U+ P! G6 E( e< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>9 y7 J" w9 g$ }% [- I, d
< ><FONT size=2>    (文件计数)</FONT></P>8 [7 V* B: f9 }( H; l% _7 W2 }! W! V
< ><FONT size=2>}
9 I& s. t: {; A: O9 J7 d </FONT></P>. {1 O% r' `9 }0 h$ W# t0 P& @
< ><FONT size=2>3.</FONT></P>
  W; X8 h" C* k- r3 Q' X6 I) @< ><FONT size=2>{</FONT></P>3 \4 T. w+ G6 u; V
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
9 P0 V1 I. f5 \6 m+ l; D<P ><FONT size=2>}</FONT></P>& n) w9 y) W! j
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
- @, B1 h8 `: d. Y* G9 w3 @  ?( G<P ><FONT size=2> </FONT></P>: R+ m, u4 u: t6 A" E. `
<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>
" |" T  `3 K1 l/ |& p( a  m<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
1 [, a: q/ z6 Y<P ><FONT size=2> </FONT></P>; p' Y* I! \. Q: X0 A
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>* U0 j3 ]% I. c6 j0 e9 L  o$ A5 _
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>" Y: L' B& P; [
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)+ Z, T+ C% O. Y0 F) J: b1 ~- l. z
 </FONT></P>2 r" G! ^, R8 L7 L' W
<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构% b' x4 ]6 Y$ I5 }' {
 </FONT></P>; N0 @8 i% r' s5 c4 g
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>
- e4 K% a2 l+ Q% {<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
0 m6 _0 {* U3 {- t; K  N5 K5 s( T<P ><FONT size=2>    {</FONT></P>/ \+ z( a& h+ \/ {
<P ><FONT size=2>    #ifndef PACKER</FONT></P>; r9 @- h0 Y' G1 ?: U: g/ w6 K& I! c
<P ><FONT size=2>        strcpy(y,x);</FONT></P>: [" J2 ~/ t& r: F
<P ><FONT size=2>        return true;</FONT></P>8 Y( H5 F# N# _; F5 D  @0 Z9 Q
<P ><FONT size=2>    #else</FONT></P>
' q' f8 a6 C" w9 [! M" |7 L8 Q. y9 [<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>$ S5 m4 Z1 [  p# U
<P ><FONT size=2>        否则,返回false</FONT></P>
; K; |2 Z0 X! W<P ><FONT size=2>    #endif</FONT></P>
5 k, x' `; ~6 [) `' B9 ~<P ><FONT size=2>    }2 t! N1 M( v7 K& D' c
 </FONT></P></FONT>
6 u. o+ _0 M' R% S<P ><FONT face=Arial size=2>  程序中应该有如下片断
, X" ]% e: f+ t, Z) Q </FONT></P><FONT face=宋体>  O4 K5 }& n0 I
<P ><FONT size=2>    char szFile[256];</FONT></P>
: l; k1 F3 h4 F  A5 }8 ~<P ><FONT size=2>    CPackFile packer;</FONT></P>
; q/ c& n% q( ~5 a<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
1 O, ^0 Q# z/ j2 b! ~# o7 o<P ><FONT size=2>    ................</FONT></P>
: u/ I/ o: l6 p1 K+ J<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>8 A* K$ }; B6 m: B/ g
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
8 M5 m8 N8 _  Y7 t<P ><FONT size=2>    </FONT></P>
) B# I- R4 X* _- q7 s<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>7 |% l9 z( k2 _! `! j
<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>  e' J/ N" A  G
<P ><FONT size=2>  欢迎和我交流</FONT></P>& g% S" w! z: Z2 {
<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
% Y: |6 f" a6 X8 Q; ?% J<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>
  e, L1 @7 X$ x* y8 [<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-4-21 08:24 , Processed in 0.456836 second(s), 58 queries .

回顶部