QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-12-7 14:01 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<TABLE>
! A* ^1 o! Z( u) w, J# L# D. Z  b8 r) Y% W; u% j* v' K* z/ |
<TR>3 I# J% d& V+ X% o, e
<TD width="100%">9 I2 }( r! Z4 h) E2 V; }) [
< align=center><FONT color=#ffffee><B>游戏中的资源打包技术</B></FONT></P></TD></TR>7 ~4 G  F, x; E7 b9 l0 K
<TR>
) p, ~( N3 R6 ^+ W& L7 U. m<TD width="100%"> </TD></TR># N$ Z3 i) A; d1 v7 W
<TR>! ]' r) ]7 P3 ?6 h% V
<TD width="100%"><FONT size=2>  打包,很形象的,就是把零散的东西转换为单一的东西。常用的压缩软件就可以说是给文件打包。那么,在游戏中为什么要打包?有什么意义么?个人认为,有以下几个意义:
% c3 Y5 v+ \4 J! j/ ^( x </FONT> ) x8 K; g6 G5 e; @7 i
< ><B><FONT size=2>1.安全性。</FONT></B></P>' A" w5 C" q) ?9 h. r
< ><FONT size=2>如果你的游戏重要数据以文本文件的形式保存在某些文件中,然而你又不希望玩家随意修改这些数据。(比如某些ini文件之类的)把他们和其他2进制文件全部打包在一起的话,这个问题就可以避免了。
- A# h" C" q2 U5 \1 f </FONT></P>
( D5 `: v4 {7 C: {; B' `, E* ]< ><B><FONT size=2>2.节约磁盘空间。</FONT></B></P>: n& O  Y& Q$ w
< ><FONT size=2>文件太多的话,很容易产生“碎片”。比如一个1个字节的文件,占用空间就高达8Kb。(这个是由windows文件管理系统决定的),如果是很多这样的文件,就可能会发生这种情况:xxxxx个文件,实际大小1xxMb,占用空间3xxMB,(这里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服。6 t; I3 N0 ?" I! G
 </FONT></P>2 F" p, Z3 N" K. @0 L
< ><B><FONT size=2>3.美观</FONT></B></P>
. w# \) x- e, E4 y. ]< ><FONT size=2>简单的少量文件总比一大堆乱七八糟的东西更让人觉得舒服。
* @$ c( m( N) l. v </FONT></P>
( N# X! |* D$ l. I5 g< ><FONT size=2>4.还没想到......</FONT></P>
) }/ l+ m3 g' b3 c3 z! E< ><FONT size=2> </FONT></P>
, w" l8 l% h$ ^< ><FONT color=#3399ff size=2>下面说说我的设计思路。</FONT></P>
9 @3 J7 ]5 y3 s* A! r, d< ><FONT size=2>打包后的文件该是怎样一种结构呢?</FONT></P>+ F- ]* {- ?7 I- S
< ><FONT size=2>我想到的有以下几种结构:
8 y. b9 y5 c, E+ P( l% j# \6 p$ V </FONT></P>
8 |4 q1 w6 b6 r< ><FONT size=2>1.</FONT></P>( ^" [/ A  K$ i# G
< ><FONT size=2>{</FONT></P>4 J. w- F1 u+ |8 J" s
< ><FONT size=2>    文件标示信息   //判断是否是正确的打包文件</FONT></P>
; k- R" a* `) A< ><FONT size=2>    文件的个数,文件索引表大小</FONT></P>6 x6 u1 L& M4 S- t- ^/ \/ V
< ><FONT size=2>    各个文件的一个索引表.里面包含每个文件的偏移,大小.类似这种结构:文件名 偏移 大小.</FONT></P>3 c: \4 b0 z7 n0 m( [
< ><FONT size=2>    各个文件内容</FONT></P>  A& U. t7 A9 W) M
< ><FONT size=2>}
. m  m0 L* p8 | </FONT></P>" r1 R0 t! V" }* C' {$ s
< ><FONT size=2>2.</FONT></P>
2 z+ `& L* u5 _; g< ><FONT size=2>{</FONT></P>
- w6 [- K- K/ o  W/ y7 x< ><FONT size=2>    文件标示信息</FONT></P>
+ b6 V- x- n5 @( c< ><FONT size=2>    第一个文件信息: 文件名长度,文件名,文件长度</FONT></P>; o5 \3 R( w: U# x" X$ {
< ><FONT size=2>    第二个文件信息: 文件名长度,文件名,文件长度</FONT></P>- W" k' u) H" W. u7 ^
< ><FONT size=2>    ......</FONT></P>( I, _. z. \( F' g, t
< ><FONT size=2>    第n个文件信息: 文件名长度,文件名,文件长度</FONT></P>
  W6 [* A( s* t( \< ><FONT size=2>    (文件计数)</FONT></P>% U/ N& A: ^: }
< ><FONT size=2>}1 Z/ }$ ]! r2 o. E+ Z
 </FONT></P>  O3 d9 J5 A  N* G
< ><FONT size=2>3.</FONT></P>8 S( p5 I' l/ N3 P1 b
< ><FONT size=2>{</FONT></P>
7 W4 E( B8 N) u  \' U. M5 }  J% @( l$ {<P ><FONT size=2>    打包成两个文件,一个负责方式1的索引表.另外一个只负责文件内容</FONT></P>4 k: |. S" z8 x( l0 c
<P ><FONT size=2>}</FONT></P>
7 h7 E) d* T. C8 _, z<P ><FONT size=2>这里第1种和第三种方式必须要得到索引表信息后才能填充文件,不如方式2直截了当.所以我在程序设计的时候采用的是方式2.当然方式1,3也有他们的好处,比如查找文件比2要方便一点.</FONT></P>5 E2 _" B+ j0 Z" F
<P ><FONT size=2> </FONT></P>
: j9 |: h* P5 W1 `8 ?) w+ p! G<P ><B><FONT color=#3399ff size=2>需要压缩么?</FONT></B></P>, M% m8 w0 V; _# N0 p$ D: @( {9 L9 e
<P ><FONT size=2>  解压缩是要花费时间的.你可以从速度和容量方面做一个折中.我在设计的时候,没有考虑压缩.</FONT></P>
; u. O( M. F  j3 j$ I: M<P ><FONT size=2> </FONT></P>
( f3 F; b5 Z- C- ]- e<P ><B><FONT color=#3399ff size=2>怎样在游戏中从已经打包了的文件读取需要的文件?</FONT></B></P>$ }( p3 q7 b) \0 I& |
<P ><FONT size=2>  最简单的方法,得到需要的文件信息,从打包文件中读取出来,放到一个临时文件中.读取这个临时文件即可,</FONT></P>
* f% n. K9 p  e! e0 q0 R<P ><FONT size=2>游戏结束之前,从程序中删除这个临时文件即可.这里就带来了一个问题:性能.每次都要进行I/O操作.如果每个文件都不是非常大的文件的话,这个办法还是可以的.或则你需要高性能的东西,那就只有一个办法:把你的程序中所有对文件操作都改到对内存进行操作.这样只要把需要的文件从打包文件中读取到内存中即可.或者还有另外的方法,直接在打包文件中读取(这个我还不知道怎么实现,盼望高手赐教之)
' U/ r* J% b  f, x& k </FONT></P>2 y; g3 H  t) d( c& w3 k4 V
<P ><FONT size=2>  在制作游戏过程中,当然不用打包,只是在正式版发布后,把所有已经做好了的资源(比如图片,一些数据文件,脚本文件等)打包再一起就可以了.类似如下结构1 j" P: j9 k5 }
 </FONT></P>3 n  O; K" n" }) V. @6 N8 }
<P ><FONT size=2>  //假设这个是一个打包类的一个成员函数,</FONT></P></FONT><FONT face=宋体>% \  F9 f) R1 U3 E2 `
<P ><FONT size=2>    BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile)</FONT></P># G# |+ P. q) u4 G( X6 f
<P ><FONT size=2>    {</FONT></P>
0 U* X5 m. r4 Q4 N<P ><FONT size=2>    #ifndef PACKER</FONT></P>
) {5 c) j  r2 m' D! f2 w0 g. ~" W<P ><FONT size=2>        strcpy(y,x);</FONT></P>& h7 g9 q  s3 P% C  S* {+ Q
<P ><FONT size=2>        return true;</FONT></P>( h! U3 ^4 k( O6 h' l
<P ><FONT size=2>    #else</FONT></P>. u; H  P0 G# r' ~& _8 {! l2 f
<P ><FONT size=2>        在打包文件中查找szFindFile,如果找到,创建文件名为szTempFile的文件,返回true</FONT></P>. q7 X' b' ?# i9 r; Z
<P ><FONT size=2>        否则,返回false</FONT></P>$ z% q8 B- V* j! M9 ^8 B
<P ><FONT size=2>    #endif</FONT></P>
0 @$ E( c/ E' c  b: S5 N<P ><FONT size=2>    }  x2 k5 S9 l( R1 B/ d. W
 </FONT></P></FONT># x3 E, M5 B% i
<P ><FONT face=Arial size=2>  程序中应该有如下片断
' ^7 A0 J7 q. i9 ?% {2 O# v </FONT></P><FONT face=宋体>
$ V' P3 T6 {& K3 P6 M' c( |<P ><FONT size=2>    char szFile[256];</FONT></P>$ Q' A' K3 c: m" n5 R+ q+ d9 h
<P ><FONT size=2>    CPackFile packer;</FONT></P>9 ^/ _$ z, i# H9 B7 o! x' ]  X
<P ><FONT size=2>    packer.OpenPackFile("somefile.pak");</FONT></P>
3 \7 Z( ^8 {  n5 U% h0 M) m<P ><FONT size=2>    ................</FONT></P>8 g: t8 |' j& _' B9 W: y
<P ><FONT size=2>    if(packer.GetPackFileFromPacker("resource.bmp",szFile))</FONT></P>' C/ B. H* h9 z
<P ><FONT size=2>       do something....</FONT></P></FONT><FONT face=Arial>
& A( V0 m1 f- f, ^" S1 e8 C9 F% H<P ><FONT size=2>    </FONT></P>
; v/ V/ v$ n  ~. u# D<P ><FONT size=2>  下面看看我的具体程序吧!</FONT></P>
+ V/ c5 @5 w3 H* T3 h<P ><FONT size=2>  <a href="http://www.gameres.com/Articles/Program/Control/packer.rar" target="_blank" >程序下载</A></FONT></P>( K7 X, c, t/ q% |, N! m
<P ><FONT size=2>  欢迎和我交流</FONT></P>3 e! B/ r, J- W3 T! [$ v; m: v
<P ><FONT size=2>  <a href="mailtE-mail:game-diy@163.com" target="_blank" >E-mail:game-diy@163.com</A></FONT></P>
, B: @9 @$ W( r8 ~" K6 h0 Q% X<P ><FONT size=2>  OICQ:30784290(难得糊涂)</FONT></P>
- A0 d1 h: A% d/ V8 h! v<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-20 20:33 , Processed in 0.416324 second(s), 58 queries .

回顶部