QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>2 r2 ~3 p% g5 k3 p* l
9 k/ i( j" {" F) F0 }
<TR>- W4 i0 y3 X% |) @; b( K* P
<TD width="100%">
! C2 L/ \+ m; Q. D! c4 O< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
7 S0 F1 E( i  N2 @( |' X<TR>3 k( B0 O+ c$ _* D1 o
<TD width="100%"> </TD></TR>
/ z7 s" _. _  P. C<TR>
& q+ Z& o0 p7 z<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:1 Q% L  \7 l& n! d; L$ W
 </FONT>
5 o1 M2 V1 J7 V8 @< ><B><FONT size=2>1.安全性。</FONT></B></P>
. H5 w1 z8 y  d( d# U) R6 v0 M, J< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。( q) Q, O2 c; D6 j) @! ~
 </FONT></P>
0 I: F  B0 }( u< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>
% w* \3 h2 u1 k6 k1 Q< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。1 [( L( ?. v. _, }4 c  Q8 u: Z9 ^
 </FONT></P>
- M4 V0 `- e- h- x, r< ><B><FONT size=2>3.美观</FONT></B></P>+ \! [1 N4 H  K* x* A2 i
< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。( A$ k: d) \- u' Y0 D2 A
 </FONT></P>8 [+ @* q; w3 I8 D+ w* {) K, U
< ><FONT size=2>4.还没想到......</FONT></P>
) b  @( I* a; m& q; ?* o< ><FONT size=2> </FONT></P>
6 T2 x4 R3 X6 h# R- H< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
, O8 k; R# R% d, n< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
3 `5 R! O+ T6 R+ J. U< ><FONT size=2>我想到的有以下几种结构:
% @( B* W- \2 r# P8 A) L; U </FONT></P>
4 P8 u3 d+ l1 [% [" m  A+ F0 a< ><FONT size=2>1.</FONT></P>
  G% M8 ^& o" w9 H< ><FONT size=2>{</FONT></P>
/ a: E9 ^$ K, u* z# G< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>
' C1 R2 o% V  G6 M7 L7 z3 [< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>. c# s5 t1 s3 [$ z
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
  y: p8 G- ^2 {; M< ><FONT size=2>    各个文件内容</FONT></P>7 }3 B% x/ B4 \/ N* b8 ]# P
< ><FONT size=2>}3 `& s1 h3 H5 W, l* W4 y
 </FONT></P>
( i% W' q* K  g* f: N- C; y< ><FONT size=2>2.</FONT></P>9 y; g( n2 i9 m4 L
< ><FONT size=2>{</FONT></P>
& f* f7 h0 E, O7 ~! A8 V< ><FONT size=2>    文件标示信息</FONT></P>
8 M: ?1 t2 R, `< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>3 _. _% _7 h3 O, \5 H* |/ O
< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
' e' n' g* h/ x9 |# h3 S' B, F< ><FONT size=2>    ......</FONT></P>! V! G5 ?0 Q! o6 K1 ]! u. ]* |
< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>. @# E# g0 j" R
< ><FONT size=2>    (文件计数)</FONT></P>  g8 B$ X4 S) B/ d8 Y' F7 H
< ><FONT size=2>}
9 K) g4 T: _9 x/ L/ X </FONT></P>% d; d" M$ R+ k9 F! R
< ><FONT size=2>3.</FONT></P>
7 U9 y+ ?+ z' F7 y4 _8 \! f< ><FONT size=2>{</FONT></P>8 K# K, [$ h) [3 D) O
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>2 d8 g  f/ x, _( \2 b
<P ><FONT size=2>}</FONT></P>4 @; O8 t" B9 i
<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>" ?/ n) H( U1 |4 K% r6 N+ O
<P ><FONT size=2> </FONT></P>
8 p* T( o9 m& d" L<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>( V$ T1 Y/ J( x
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
- M) f& H4 w1 J: u<P ><FONT size=2> </FONT></P>( H5 d% d7 y: X  l0 F1 d# [# g
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>" |/ j1 j9 r0 z# {9 }( J
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>; N, N0 i$ ^# b/ A* q" p7 G! [
<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)
# |' r* T) w- D7 w </FONT></P>
# K( v  N2 h3 o3 y1 V* w2 a<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构
5 b0 T. f! \- a1 L </FONT></P>$ r: U/ b4 }& Y. n1 s
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>0 J' z, L6 `7 o; g
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>
- A" c3 A1 n( G1 J/ ^+ S* z& b- s<P ><FONT size=2>    {</FONT></P>" C' l( J2 M% ?1 L* ]
<P ><FONT size=2>    #ifndef PACKER</FONT></P>9 F( e. N; N2 H4 ^
<P ><FONT size=2>        strcpy(y,x);</FONT></P>; x, ^, ?3 N  A5 u
<P ><FONT size=2>        return true;</FONT></P>
5 Q# n$ P9 ?9 o# C! p  a<P ><FONT size=2>    #else</FONT></P>0 s  i7 `, L, f/ S5 a: x9 F4 _
<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>; o- Q4 s* w- y3 Y+ ]
<P ><FONT size=2>        否则,返回false</FONT></P>
- \, z. D5 ]7 y8 I<P ><FONT size=2>    #endif</FONT></P>
. E/ \1 w& i' l- X6 I5 Y7 O" F<P ><FONT size=2>    }
! @) o; X, Y& S! k </FONT></P></FONT>9 w  B' F& c0 P/ y) I
<P ><FONT face=Arial size=2>  程序中应该有如下片断) e1 J$ W( q4 Z2 e
 </FONT></P><FONT face=宋体>0 T/ b! q  m* u/ t/ e4 A+ T
<P ><FONT size=2>    char szFile[256];</FONT></P>
2 u6 A. m# \8 `3 C, R4 D' K<P ><FONT size=2>    CPackFile packer;</FONT></P>
! I7 _1 h' R, T2 l8 O1 ~<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
0 @* E4 G( O6 s" x/ |<P ><FONT size=2>    ................</FONT></P>
7 D- P% p. ?: K* c* J# S& B5 D<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>
; n/ |" u: ]+ ^- G4 [<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>. r. g7 L$ t! B7 c; [
<P ><FONT size=2>    </FONT></P>
/ R% W/ k  P# l8 q<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>8 H* r6 ^* J3 W$ `" v: i+ l
<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>
6 g4 X; n( M( M2 C( \<P ><FONT size=2>  欢迎和我交流</FONT></P>
4 L; U1 V& j# }! Z# D% M<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>4 {* ]$ [- F! C- {7 r" f+ D6 I+ w
<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>' N( l1 b" u# V& x1 I
<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-30 09:23 , Processed in 0.844207 second(s), 57 queries .

回顶部