QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>
: o) X% ~7 z' [: D9 \2 U$ J  F
9 w% y# a7 w) _4 ]<TR>
2 t0 n  v2 e, f# W) J  ?<TD width="100%">( T8 C: }4 Y4 e2 }( l/ U2 B
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>
( c- F  o  H* V0 C9 J: _2 F2 X<TR>
6 U- w3 \  U+ Z- \1 p2 B<TD width="100%"> </TD></TR>
' r' r( k8 @% p9 s2 p<TR>3 w+ m  b' X. H# a  F7 J
<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
% a7 B5 k1 f- O9 a& H </FONT>
8 T. C; b/ ?; e1 B6 y9 w0 H* c# F< ><B><FONT size=2>1.安全性。</FONT></B></P>
* c% ^- q0 N2 X! c8 S: F) t, W. P( b< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
2 r. i4 N; g- G0 c/ ~ </FONT></P>
3 h0 O. ~: S8 @) R" t9 P, S6 I< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>' m) Y! C1 m+ E& P" D: y  J" r
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。
5 \1 z: k; Z1 ]7 n8 E% {0 @3 {/ l2 z </FONT></P>2 h) }2 g" j/ M* C8 `
< ><B><FONT size=2>3.美观</FONT></B></P>
* O( F" q& b% K( n, U% _1 j( ?< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
* L; P2 j. u% X: b, B </FONT></P>
( u  C4 S: T/ a# d; [$ @< ><FONT size=2>4.还没想到......</FONT></P>8 v: l& z4 Z2 d  C
< ><FONT size=2> </FONT></P>
4 W5 j. @# \; S< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
8 c5 h, V4 m7 `  E* U< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>
# O3 B, s, |  R, `- b& C2 c< ><FONT size=2>我想到的有以下几种结构:3 w) l9 f2 A; D% E' D
 </FONT></P>
* r5 }9 `. ~: ^( Q9 ?5 q/ B< ><FONT size=2>1.</FONT></P>
2 q3 T) b9 @) c# H* U< ><FONT size=2>{</FONT></P>4 u- C9 C5 e- S2 k
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>- z2 i1 |9 e4 v  e1 z/ O! ~
< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>! N3 G! I* A7 J6 _! A; d4 ^
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>
+ R) _" X# t% t6 B' z) |< ><FONT size=2>    各个文件内容</FONT></P>
; ~% H! k" {  W0 E: T< ><FONT size=2>}' q+ U) G' s% ~8 |& z4 M
 </FONT></P>4 N$ }6 q0 ^# s
< ><FONT size=2>2.</FONT></P>' w$ s& {+ z( s6 P- ~
< ><FONT size=2>{</FONT></P>
; Z+ \. O0 Z6 O! b/ i) R& {< ><FONT size=2>    文件标示信息</FONT></P>  B# @/ Y# {# u' Y; p( d
< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>$ |+ A# p0 F( f
< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>
. k! O- j) b5 `< ><FONT size=2>    ......</FONT></P>2 U# s$ O) x: f5 v
< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>: h% {* U* g# F+ V5 l( P6 B! Q
< ><FONT size=2>    (文件计数)</FONT></P>8 }* L5 C( ^; u- W" M$ a
< ><FONT size=2>}' E+ K, G; C9 B7 ]% O
 </FONT></P>9 C" `- \( s! |
< ><FONT size=2>3.</FONT></P>
2 v, `$ t$ w- j. Q: I6 `8 [( Q< ><FONT size=2>{</FONT></P>4 I9 O# D9 g0 Y/ ]- t
<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>
) f% `. T- b6 d( y' S3 E( ^0 C<P ><FONT size=2>}</FONT></P>
, l4 D$ e9 u) v, x$ _1 X) ]" \<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>
. L- j+ |& ^; C6 L+ X. J<P ><FONT size=2> </FONT></P>* ~- v! ?$ u  s  _; G
<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>( B1 @$ d+ f) d
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
, u2 q, |% z5 P+ `<P ><FONT size=2> </FONT></P>; ^1 q, C) B% {
<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>. e- H- E9 I. A% I' Y
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
3 E, C# t5 P1 _  l! j3 |3 y<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)
- C: v' I8 k% t6 k+ g </FONT></P>0 t5 K6 ^; S; G. R
<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构  I" s2 I6 Y! |& V
 </FONT></P>: |1 {; _" z& a8 D1 g7 L+ F7 z
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>  r- M9 h" s( _. w) n: _* Y
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P>4 {% w6 i7 z* f) w# W9 t
<P ><FONT size=2>    {</FONT></P>
6 \  N1 v% Y7 E. W' |' F8 S/ Y<P ><FONT size=2>    #ifndef PACKER</FONT></P>3 c8 d/ Q& B  Y4 F
<P ><FONT size=2>        strcpy(y,x);</FONT></P>& m! n! r/ R. S+ _9 [. C
<P ><FONT size=2>        return true;</FONT></P>; c! y* ^9 L/ C) F+ K
<P ><FONT size=2>    #else</FONT></P>
8 q. a. n5 p; t9 L) C  d* j! G<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>8 u, \  u, G# X" V( \2 S. y6 s
<P ><FONT size=2>        否则,返回false</FONT></P>
0 o6 d- m1 q- |5 p( n. {7 ^<P ><FONT size=2>    #endif</FONT></P>
/ S0 Q# y: S5 F<P ><FONT size=2>    }) ]; k4 N, Q! A- I! |$ d% |+ t, g% L
 </FONT></P></FONT>
1 B2 \) M* C& z5 Q3 Y" o- ~: q<P ><FONT face=Arial size=2>  程序中应该有如下片断$ o# E, V0 ?( b6 R2 T
 </FONT></P><FONT face=宋体>' Z4 _+ C  R+ j
<P ><FONT size=2>    char szFile[256];</FONT></P>- A9 H% h+ G+ s1 e* F( D0 l
<P ><FONT size=2>    CPackFile packer;</FONT></P>9 I8 @9 q+ \) t1 F* b% U# {4 ~1 ?
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
1 f0 y& `* r% L% x/ B# q0 p6 N<P ><FONT size=2>    ................</FONT></P>; a8 u% G. s: E  `' C0 M
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>0 A9 K6 y4 T8 k  X% X+ [7 a
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>; z. k( k, s7 R, x9 |3 s' Z
<P ><FONT size=2>    </FONT></P>! V9 @2 `" Z+ C
<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
& {: ~! M0 A% @$ U4 @<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>6 g- C! p3 {6 z; |. o) {" _
<P ><FONT size=2>  欢迎和我交流</FONT></P>+ i! K. y3 ~% M. t7 Y
<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
6 g) ]: O+ F$ t) T$ x<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>, i5 c- ^, f. g: 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-25 10:33 , Processed in 0.545382 second(s), 57 queries .

回顶部