??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲第一极品精品无码久久 ,久久伊人影视,7777精品伊人久久久大香线蕉http://www.shnenglu.com/mybios/category/3086.html游戏开?C++ DirectX 数学 计算机图形学 SQL Server <BR> <BR> <a href="http://www.shnenglu.com/mybios" style="font-size:14px;color:#FFFFFF">q回我的Blog首页</a>zh-cnMon, 19 May 2008 18:01:43 GMTMon, 19 May 2008 18:01:43 GMT60【{贴】数据打包格?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/19/15416.html</link><dc:creator>李锦?/dc:creator><author>李锦?/author><pubDate>Sun, 19 Nov 2006 00:17:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/19/15416.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15416.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/19/15416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15416.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15416.html</trackback:ping><description><![CDATA[ <div align="left">  游戏q行和显C的速度固然重要Q不q我认ؓ(f)Q在游戏中另外一个速度Q游戏装入的速度也同样不可轻视。试想一个游戏,动不动就要装入数据,而且每次装入的时间都令h{到“心(j)来慌”的地步Q我x(chng)怕也没有什么h愿意玩下ȝ?br /><br />  选择一个好的打包数据格式,对于~程人员来说Q是一件很重要的事情。一般来_(d)一个游戏的文g个数太多Qƈ不是一件好事情Q不光占用的盘I间大,而且严重的媄(jing)响装入速度。不q这样做的优点也很明显:(x)可以很详l的分类Q可以大大的减小~程人员的工作量。另外一U做法是Q把所有的数据全部攑֜一个文仉面,q样的做法和上面一U做法的优缺Ҏ(gu)好相反,装入速度比较快(因ؓ(f)只要做一ơ文件打开的操作)(j)Q但是由于所有数据都攑֜一P文g数据的组l比较复杂,要求~程人员p大量的精力去定位数据的格式和存放位置。因此,选择一个合适的数据打包格式Q实际上是在这两种情况之间选择一个^衡点Q它既不会(x)Ҏ(gu)戏的装入速度造成明显的媄(jing)响,也不?x)给~程人员带来额外的负担?br /><br />  那么Q对于一个游戏来_(d)数据应该怎么l织呢?其实现在有很多好的游戏,参考一下他们的数据文g׃(x)发现q个q点其实很好找。现在大多数的游戏,基本上把游戏需要用到的数据分门别类的存放,每一cL据放在一个文仉面。比如说音乐攑֜一个文仉面,地Ş囄攑֜一个文仉面,_造型、动L在一个文仉面,游戏需要用到的囄攑֜一个文仉面,人物的对话、事件说明放在一个文仉面……那么这些数据在文g里面怎么l织呢?<br /><br />  q是一句话Q分门别cR下面以游戏最基本的地形图素ؓ(f)例,说明数据的组lŞ式。一般说来,游戏的地囄很多大大小的“图素”组成的Q这些图素分为几层,每一层的囄基本上可以算作一c:(x)比如说地面层可以作一c,C层可以算作一c,然后天空层(背景层)(j)可以作一c,部队、物品可以算作一cR而在地面层里面,又可以进一步的分类Q比如说地Ş有山圎ͼ沙漠Q草原,林Q河,h……在游戏中,是可以分为场景的Q一般的情况下,每个场景所涉及(qing)到的地Ş不会(x)很多QL以某一cd型地行ؓ(f)主,然后加入量其他的地形作为点~。针对这U情况,我们可以把同一cȝ地Şq箋(hu)的放在文件的某一个位|,q样我们在装入场景的时候,只要在这个位|一ơ读取这U地形的数据可以了(jin)。一般游戏在制作的过E中都有一个场景生成器Q或者叫作拚囑֙Q它的作用就是生成地䏀—或者说生成场景。这个拚囑֙在初期的时候读人的数据肯定不是已经打包?jin)的Q因为美术还要对地Ş的基本图素进行某些修攏V?br /><br />  所以我认ؓ(f)Q好的数据打包格式应该是Z拚图器的Q他把每一U数据分门别cȝq箋(hu)存放在某一个文件之中或者文件的某一个位|,q样能够大大的加快程序读取数据的速度。这样几能够使游戏文件看h很简z,也会(x)大大的有利于E序的开发?br /></div> <img src ="http://www.shnenglu.com/mybios/aggbug/15416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?/a> 2006-11-19 08:17 <a href="http://www.shnenglu.com/mybios/archive/2006/11/19/15416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】游戏中如何d压羃包文?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/19/15414.html</link><dc:creator>李锦?/dc:creator><author>李锦?/author><pubDate>Sun, 19 Nov 2006 00:16:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/19/15414.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15414.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/19/15414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15414.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15414.html</trackback:ping><description><![CDATA[ <font size="2">  我们在市(jng)ZC(jin)一个游戏,很少?x)轻易的看到游戏目录里一堆的BMPQPCX资源囄。难道他们不使用BMP之类的文件作为图片资源吗Q非也,其实他们把这些资源图片进行了(jin)打包、压~?br /><br />  丑և个游戏的例子吧,大名鼎鼎westernwood的《红色警戒》的.mix文g是一U压~包Q里面包含了(jin)一堆堆的游戏图片,声音{资源。还有blizzard的《星际争霸》、《暗黑破坏神》、《魔兽系列》的.mpq文g也是一U压~包Q里面包含了(jin)各种游戏使用的资源。几乎所有的游戏都用C(jin)压羃包?br /><br />  那么Z么要使用q种压羃包呢Q原因很多,首先是压羃Q游戏中使用的图片等资源都是极其适合压羃的,q样减了(jin)游戏的体U。如果把《红色警?》的资源全部解开怿?x)超q?G。其ơ压~后文g体积的减会(x)带来ȝ速度的显著提高。通常一?M的BMP文g可以被压~到700K以内Q读取一?M的文件和d一?00K的文件然后再内存?sh)解压的速度Ҏ(gu)是可惌知的。最后,大量的资源文g打包能得游戏目录清晎ͼ而不是一堆堆的文件夹和文Ӟq样能减磁盘空间的费Q也减少?jin)磁盘碎片?br /><br />说了(jin)那么多压~包的好处,我们在游戏中到底怎么使用压羃包呢Q?br />  1Q我们需要定义我们自q压羃包文件存储格式?br />  2Q根?我们写一个压~工hҎ(gu)戏中的资源进行压~存储?br />  3Q根?我们写一个解压羃的库以便我们游戏中用?br />  4Q在游戏的代码中Q我们调用这个库Q来d我们包中的文件?br /><br />  看到q儿Q似乎我们需要做的工作还是很多、很复杂的。要定义一个文件结构,又要写压~工兗还要写解压库。而我们真正用确实在最后一步,而且是简单的调用一个库而已。似乎有点得不偿׃(jin)。好?jin),我们现在要找一条捷径来完成我们游戏使用压羃包的问题Q对??来说其实很好办,现成的就有很多压~Y件可以生成压~包Qwinzip,winrar,winace ……都是非常好的压~工Pq样我们不用定义压羃包的存储格式Q也不用~写压羃工具。不费Q何力气就完成??两步。那么第3步又如何呢?文g存储格式不是我们设计的,我们无法知道文g是如何组l、如何压~的Q跟不用说知道如何压~了(jin)。不q上|搜索一下,我们q是能得C些winzipQwinrar格式的解压羃源代码的。不q研Ivq些代码来又是g痛苦的事情,更何况还要用在自q游戏里?br /><br />  到这里,我们又遇C(jin)严峻的考验Q现在我向大安重介l我们的压u法宝Q?/font> <a > <font size="2">MDFile文gpȝ</font> </a> <font size="2">。那么,MDFile是个什么东东呢QMDFile是一个可扩展的文件操作库Q可以用最最单的Ҏ(gu)实现对Q意压~包格式内文件的d。那么到此,我们??也都可以实现?jin)。下面我们就以MDFileZ来说以下怎么使用它来d我们包中的文件?br /><br />  首先我们先获取我们需要的</font> <a > <font size="2">MDFile</font> </a> <font size="2">库,C国游戏开发技术咨询网上下?/font> <a > <font size="2">MDFile?/font> </a> <font size="2">Q点?yn)L站原创,扑ֈ</font> <a > <font size="2">MDFile</font> </a> <font size="2">q下载下来?br /><br />  库攑ֈ你的工程中,q设|好Q这里我׃详细说如何设|一个外部的库了(jin)Q如果不?x)的话你可以参考相关的书。好?jin),下面我们开始我们的代码?jin),q里以读取test.zip中的一个test.txt文gZQ?br /><br />我们在程序中d一个LoadFile的函数来载入一个包里的文g?br /></font> <font face="?hu)? size="2">bool LoadFile(char* filename,char* packfile)<br />{<br /> (tng) (tng) (tng) BYTE* buf=NULL; // 用来存放d出的文g的内?br /> (tng) (tng) (tng) </font> <font face="?hu)? size="2">CMD_File cmdfile(“ZipExt.dll?; // 我们先生成一个实?br /> (tng) (tng) (tng) </font> <font face="?hu)? size="2">cmdfile.Open(“test.zip?true,true); // 打开test.zipq个压羃?br /> (tng) (tng) (tng) </font> <font face="?hu)? size="2">cmdfile.Locate(“test.txt?; // 定位到test.txt文g<br /> (tng) (tng) (tng) </font> <font face="?hu)? size="2">buf=new BYTE[cmdfile.GetLength()];// Ҏ(gu)test.txt的大分配内?br /> (tng) (tng) (tng) </font> <font face="?hu)? size="2">cmdfile.Read(buf); // d文g到我们的内存?sh)?br /> (tng) (tng) (tng) </font> <font face="?hu)? size="2">// x(chng)Qbuf中已l存储了(jin)我们需要的test.zip中的test.txt文g的内容了(jin)<br /> (tng) (tng) (tng) </font> <font face="?hu)? size="2">// 是不是很单呢Q?br />}</font> <font face="Arial"> <br /> <br /> <font size="2">l心(j)的朋友可能已l注意到?jin)?/font> </font> <font face="?hu)? size="2">CMD_File cmdfile(“ZipExt.dll?;</font> <font face="Arial"> <br /> <br /> <font size="2">  q个初始化是什么意思呢Q就是用ZipExt.dllq个扩展库来打开我们的test.zip文gQ因为MDFile本nq不支持Zip格式Q他支持内部的一U叫epk的压~包格式Qؓ(f)?jin)让他支持Zip你必获得ZipExt.dllq个扩展库,同样的如果你需要Rar支持你需要获得RarExt.dllq个扩展库。好在我们刚下蝲的MDFile包中已经包括?jin)一个ZipExt.dllQ在Sample\Sample4\Release中)(j)Q也好在@J--S Studio在不停的开发MDFile的扩展库Q以便我们能够用更多的压羃包格式?br /><br />  需要一提的是:(x)使用q些现成的压~Y件制作文件包虽然单,但是也有很多问题Q例如安全性,有时候我们不惌其他人看到游戏中用到的资源,q时如果我们用的是Zip格式Q那可能轻易的被别开q修改了(jin)。这Ӟ其实使用MDFile内部的epk格式比较好Q他使用动态加密技术,同时epk格式不被其他压羃软g支持Q另外他的其他一些特性都是非怸错的。同时ؓ(f)?jin)支持epk格式Q他q提供了(jin)一个JSFilePackerE序用来打包需要的文gq存成epk格式。所有的q些都可以在我们下蝲的MDFile中得到??(JSFilePacker在tools?</font> </font> <font face="Arial"> <br /> <font size="2"> <br />  <a >立即下蝲MDFile?/a></font> </font> <img src ="http://www.shnenglu.com/mybios/aggbug/15414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?/a> 2006-11-19 08:16 <a href="http://www.shnenglu.com/mybios/archive/2006/11/19/15414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】游戏中的资源打包技?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/19/15413.html</link><dc:creator>李锦?/dc:creator><author>李锦?/author><pubDate>Sun, 19 Nov 2006 00:14:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/19/15413.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15413.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/19/15413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15413.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15413.html</trackback:ping><description><![CDATA[ <div align="left">打包Q很形象的,是把零散的东西转换为单一的东ѝ常用的压羃软g可以说是给文g打包?/div> <div align="left">那么Q在游戏中ؓ(f)什么要打包Q有什么意义么Q个为,有以下几个意义:(x)</div> <div align="left"> (tng)  1.安全性?/div> <div align="left"> (tng)  如果你的游戏重要数据以文本文件的形式保存在某些文件中Q然而你又不希望玩家随意修改q些数据。(比如某些ini文g之类的)(j)把他们和其他2q制文g全部打包在一L(fng)话,q个问题可以避免了(jin)?/div> <div align="left"> (tng)  2.节约盘I间?/div> <div align="left"> (tng)  文g太多的话Q很Ҏ(gu)产生“碎片”。比如一?个字节的文gQ占用空间就高达8Kb。(q个是由windows文g理pȝ军_的)(j)Q如果是很多q样的文Ӟ可能会(x)发生q种情况Qxxxxx个文Ӟ实际大小1xxMb,占用I间3xxMBQ(q里只是打一个比方,实际相差不会(x)那么多)(j)。这也许?x)让人感觉不舒服?/div> <div align="left"> (tng)  3.观</div> <div align="left"> (tng)  单的量文gL一大堆׃八糟的东西更让h觉得舒服?/div> <div align="left"> (tng)  4.q没惛_...... </div> <div align="left">  下面说说我的设计思\?/div> <div align="left"> (tng)  打包后的文g该是怎样一U结构呢?</div> <div align="left"> (tng)  我想到的有以下几U结?</div> <div align="left"> (tng)  1.   { 文g标示信息 //判断是否是正的打包文g 文g的个?文g索引表大?各个文g的一个烦(ch)引表.里面包含每个文g的偏U?大小.cMq种l构:文g?偏移 大小. 各个文g内容   } </div> <div align="left">  2.   { 文g标示信息 W一个文件信? 文g名长?文g?文g长度 W二个文件信? 文g名长?文g?文g长度 ...... Wn个文件信? 文g名长?文g?文g长度 (文g计数)   }</div> <div align="left"> (tng)  3.   { 打包成两个文?一个负责方?的烦(ch)引表.另外一个只负责文g内容   }   q里W?U和W三U方式必要得到索引表信息后才能填充文g,不如方式2直截?jin)?所以我在程序设计的时候采用的是方?.当然方式1,3也有他们的好?比如查找文g?要方便一? </div> <div align="left">  需要压~么?</div> <div align="left"> (tng)  解压~是要花Ҏ(gu)间的.你可以从速度和容量方面做一个折?sh)?我在设计的时?没有考虑压羃.   怎样在游戏中从已l打包了(jin)的文件读取需要的文g?</div> <div align="left"> (tng)  最单的Ҏ(gu),得到需要的文g信息,从打包文件中d出来,攑ֈ一个(f)时文件中.dq个临时文g卛_, </div> <div align="left">  游戏l束之前,从程序中删除q个临时文g卛_.q里带来了(jin)一个问?性能.每次都要q行I/O操作.如果每个文g都不是非常大的文件的?q个办法q是可以?或则你需要高性能的东?那就只有一个办?把你的程序中所有对文g操作都改到对内存q行操作.q样只要把需要的文g从打包文件中d到内存(sh)卛_.或者还有另外的Ҏ(gu),直接在打包文件中d(q个我还?sh)知道怎么实现,盼望高手赐教?   在制作游戏过E中,当然不用打包,只是在正式版发布?把所有已l做好了(jin)的资?比如囄,一些数据文?脚本文g{?打包再一起就可以?cM如下l构</div> <div align="left"> (tng)  //假设q个是一个打包类的一个成员函? </div> <div align="left">BOOL CPackFile::GetPackFileFromPacker(char*szFindFile,char*szTempFile) { #ifndef PACKER strcpy(y,x); return true; #else </div> <div align="left">  在打包文件中查找szFindFile,如果扑ֈ,创徏文g名ؓ(f)szTempFile的文?q回true </div> <div align="left">  否则,q回false #endif } </div> <div align="left">  E序中应该有如下片断 char szFile[256]; CPackFile packer; packer.OpenPackFile("somefile.pak"); ................ if(packer.GetPackFileFromPacker("resource.bmp",szFile)) do something....   </div> <div align="left">下面看看我的具体E序?</div> <div align="left"> (tng)  <a >E序下蝲</a>   </div> <div align="left">Ƣ迎和我交流   E-mail:game-diy@163.com   OICQ:30784290(隑־p涂)   <a target="_blank">http://GamePlusPlus.yeah.net</a></div> <br /> <br /> <img src ="http://www.shnenglu.com/mybios/aggbug/15413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?/a> 2006-11-19 08:14 <a href="http://www.shnenglu.com/mybios/archive/2006/11/19/15413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】PNG文gl构分析http://www.shnenglu.com/mybios/archive/2006/11/19/15411.html李锦?/dc:creator>李锦?/author>Sun, 19 Nov 2006 00:11:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/19/15411.htmlhttp://www.shnenglu.com/mybios/comments/15411.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/19/15411.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15411.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15411.html 前言

PNG?0世纪90q代中期开始开发的囑փ文g存储格式Q其目的是企图替代GIF和TIFF文g格式Q同时增加一些GIF文g格式所不具备的Ҏ(gu)。流式网l图形格?Portable Network Graphic FormatQPNG)名称来源于非官方的“PNG's Not GIF”,是一U位图文?bitmap file)存储格式Q读成“ping”。PNG用来存储灰度囑փӞ灰度囑փ的深度可多到16位,存储彩色囑փӞ彩色囑փ的深度可多到48位,q且q可存储多到16位的通道数据。PNG使用从LZ77z的无损数据压~算法?/p>

PNG数据块(ChunkQ?/strong>

PNG定义?jin)两U类型的数据块,一U是UCؓ(f)关键数据?critical chunk)Q这是标准的数据块,另一U叫做辅助数据块(ancillary chunks)Q这是可选的数据块。关键数据块定义?个标准数据块Q每个PNG文g都必d含它们,PNGd软g也都必须要支持这些数据块。虽然PNG文g规范没有要求PNG~译码器对可选数据块q行~码和译码,但规范提倡支持可选数据块?/p>

下表是PNG中数据块的类别,其中Q关键数据块部分我们使用p背景加以区分?/p>
PNG文g格式中的数据?/strong>
数据块符?/b>
数据块名U?
多数据块
可选否
位置限制
IHDR 文g头数据块 ? ? W一?
cHRM 和白色点数据? ? ?/td> 在PLTE和IDAT之前
gAMA 囑փ数据? ? ?/td> 在PLTE和IDAT之前
sBIT h有效位数据块 ? ?/td> 在PLTE和IDAT之前
PLTE 调色板数据块 ? ?/td> 在IDAT之前
bKGD 背景颜色数据? ? ?/td> 在PLTE之后IDAT之前
hIST 囑փ直方图数据块 ? ?/td> 在PLTE之后IDAT之前
tRNS 囑փ透明数据? ? ?/td> 在PLTE之后IDAT之前
oFFs (专用公共数据? ? ?/td> 在IDAT之前
pHYs 物理像素寸数据? ? ?/td> 在IDAT之前
sCAL (专用公共数据? ? ?/td> 在IDAT之前
IDAT 囑փ数据? ?/td> ? 与其他IDATq箋(hu)
tIME 囑փ最后修Ҏ(gu)间数据块 ? ?/td> 无限?
tEXt 文本信息数据? ?/td> ?/td> 无限?
zTXt 压羃文本数据? ?/td> ?/td> 无限?
fRAc (专用公共数据? ?/td> ?/td> 无限?
gIFg (专用公共数据? ?/td> ?/td> 无限?
gIFt (专用公共数据? ?/td> ?/td> 无限?
gIFx (专用公共数据? ?/td> ?/td> 无限?
IEND 囑փl束数据 ? ? 最后一个数据块

Z(jin)单v见,我们假设在我们用的PNG文g中,q?个数据块按以上先后顺序进行存储,q且都只出现一ơ?/p>

数据块结?/strong>

PNG文g中,每个数据块由4个部分组成,如下Q?/p>
名称 字节? 说明
Length (长度) 4字节 指定数据块中数据域的长度Q其长度不超q?231Q?)字节
Chunk Type Code (数据块类型码) 4字节 数据块类型码由ASCII字母(A-Z和a-z)l成
Chunk Data (数据块数? 可变长度 存储按照Chunk Type Code指定的数?
CRC (循环冗余(g)? 4字节 存储用来(g)是否有错误的@环冗余码

CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计得到的。CRC具体法定义在ISO 3309和ITU-T V.42中,其值按下面的CRC码生成多式q行计算Q?/p>

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

下面Q我们依ơ来?jin)解一下各个关键数据块的结构吧?/p>

IHDR

文g头数据块IHDR(header chunk)Q它包含有PNG文g中存储的囑փ数据的基本信息,q要作ؓ(f)W一个数据块出现在PNG数据?hu)中Q而且一个PNG数据?hu)中只能有一个文件头数据块?/p>

文g头数据块?3字节l成Q它的格式如下表所C?/p>
域的名称
字节?
说明
Width 4 bytes 囑փ宽度Q以像素为单?
Height 4 bytes 囑փ高度Q以像素为单?
Bit depth 1 byte 囑փ深度Q?
索引彩色囑փQ?Q?Q??
灰度囑փQ?Q?Q?Q??6
真彩色图像:(x)8?6
ColorType 1 byte 颜色cdQ?br />0Q灰度图? 1Q?Q?Q??6
2Q真彩色囑փQ??6
3Q烦(ch)引彩色图像,1Q?Q??
4Q带通道数据的灰度图像,8?6
6Q带通道数据的真彩色囑փQ??6
Compression method 1 byte 压羃Ҏ(gu)(LZ77z法)
Filter method 1 byte 滤L器方?
Interlace method 1 byte 隔行扫描Ҏ(gu)Q?br />0Q非隔行扫描
1Q?Adam7(由Adam M. Costello开发的7遍隔行扫描方?

׃我们研究的是手机上的PNGQ因此,首先我们看看MIDP1.0Ҏ(gu)使用PNG囄的要求吧Q?/p>

  • 在MIDP1.0中,我们只可以?.0版本的PNG囄。ƈ且,所以的PNG关键数据块都有特别要求:(x)
    IHDR
  • 文g大小QMIDP支持L大小的PNG囄Q然而,实际上,如果一个图片过大,?x)由于内存耗尽而无法读取?
  • 颜色cdQ所有颜色类型都有被支持Q虽然这些颜色的昄依赖于实际设备的昄能力。同ӞMIDP也能支持alpha通道Q但是,所有的alpha通道信息都会(x)被忽略ƈ且当作不透明的颜色对待?
  • 色深Q所有的色深都能被支持?
  • 压羃Ҏ(gu)Q仅支持压羃方式0Qdeflate压羃方式Q,q和jar文g的压~方式完全相同,所以,PNG囄数据的解压和jar文g的解压可以用相同的代码。(其实q也是Z么J2ME能很好的支持PNG囑փ的原因:(x)Q)(j)
  • 滤L器方法:(x)管在PNG的白皮书中仅定义?jin)方?Q然而所有的5U方法都被支持!
  • 隔行扫描Q虽然MIDP支持0?两种方式Q然而,当用隔行扫描时QMIDP却不?x)真正的使用隔行扫描方式来显C?
  • PLTE chunkQ支?
  • IDAT chunkQ图像信息必M?U过滤方式中的方? (None, Sub, Up, Average, Paeth)
  • IEND chunkQ当IEND数据块被扑ֈӞq个PNG囑փ才认为是合法的PNG囑փ?
  • 可选数据块QMIDP可以支持下列辅助数据块,然而,q却不是必须的?

    bKGD cHRM gAMA hIST iCCP iTXt pHYs
    sBIT sPLT sRGB tEXt tIME tRNS zTXt

关于更多的信息,可以参?a target="_blank">http://www.w3.org/TR/REC-png.html

PLTE

调色板数据块PLTE(palette chunk)包含有与索引彩色囑փ(indexed-color image)相关的彩色变换数据,它仅与烦(ch)引彩色图像有养I而且要放在图像数据块(image data chunk)之前?/p>

PLTE数据块是定义囑փ的调色板信息QPLTE可以包含1~256个调色板信息Q每一个调色板信息?个字节组成:(x)

颜色

字节

意义

Red

1 byte

0 = 黑色, 255 = U?/p>

Green

1 byte

0 = 黑色, 255 = l色

Blue

1 byte

0 = 黑色, 255 = 蓝色

因此Q调色板的长度应该是3的倍数Q否则,q将是一个非法的调色ѝ?/p>

对于索引囑փQ调色板信息是必ȝQ调色板的颜色烦(ch)引从0开始编P然后??……,调色板的颜色C能超q色׃规定的颜色数Q如囑փ色深?的时候,调色板中的颜色数不可以超q?^4=16Q,否则Q这导致PNG囑փ不合法?/p>

真彩色图像和带α通道数据的真彩色囑փ也可以有调色板数据块Q目的是便于非真彩色昄E序用它来量化图像数据,从而显C囑փ?/p>

IDAT

囑փ数据块IDAT(image data chunk)Q它存储实际的数据,在数据流中可包含多个q箋(hu)序的图像数据块?/p>

IDAT存放着囑փ真正的数据信息,因此Q如果能够了(jin)解IDAT的结构,我们可以很方便的生成PNG囑փ?/p>

IEND

囑փl束数据IEND(image trailer chunk)Q它用来标记PNG文g或者数据流已经l束Qƈ且必要攑֜文g的尾部?/p>

如果我们仔细观察PNG文gQ我们会(x)发现Q文件的l尾12个字W看hd该是q样的:(x)

00 00 00 00 49 45 4E 44 AE 42 60 82

不难明白Q由于数据块l构的定义,IEND数据块的长度L0Q?0 00 00 00Q除非h为加入信息)(j)Q数据标识LIENDQ?9 45 4E 44Q,因此QCRC码也LAE 42 60 82?/p>

实例研究PNG

以下是由Fireworks生成的一q图像,囑փ大小?*8Qؓ(f)?jin)方便大家观看,我们图像放大?x)

使用UltraEdit32打开该文Ӟ如下Q?br />00000000~00000007Q?/strong>

可以看到Q选中的头8个字节即为PNG文g的标识?/p>

接下来的地方是IHDR数据块了(jin)Q?/p>

00000008~00000020Q?/strong>

  • 00 00 00 0D 说明IHDR头块长ؓ(f)13
  • 49 48 44 52 IHDR标识
  • 00 00 00 08 囑փ的宽Q?像素
  • 00 00 00 08 囑փ的高Q?像素
  • 04 色深Q?^4=16Q即q是一?6色的囑փQ也有可能颜色数不超q?6Q当?dng)如果颜色C过8Q用03表示更合适)(j)
  • 03 颜色cdQ烦(ch)引图?
  • 00 PNG Spec规定此处Mؓ(f)0Q非0gؓ(f)来使用更好的压~方法预留)(j)Q表CZ压羃Ҏ(gu)(LZ77z法)
  • 00 同上
  • 00 非隔行扫?
  • 36 21 A3 B8 CRC校验

00000021~0000002FQ?/strong>

可选数据块sBITQ颜色采L(fng)QRGB都是256Q?^8=256Q?/p>

00000030~00000062Q?/strong>

q里是调色板信息

  • 00 00 00 27 说明调色板数据长?9字节Q既13个颜色数
  • 50 4C 54 45 PLTE标识
  • FF FF 00 颜色0
  • FF ED 00 颜色1
  • …?…?
  • 09 00 B2 最后一个颜Ԍ12
  • 5F F5 BB DD CRC校验

00000063~000000C5Q?/strong>

q部分包含了(jin)pHYs、tExt两种cd的数据块?块,׃q不太重要,因此也不再详l描qC(jin)?br />
000000C0~000000F8Q?/strong>

以上选中部分是IDAT数据?/p>

  • 00 00 00 27 数据长ؓ(f)39字节
  • 49 44 41 54 IDAT标识
  • 78 9C…?压羃的数据,LZ77z压羃Ҏ(gu)
  • DA 12 06 A5 CRC校验

IDAT中压~数据部分在后面?x)有详细的介l?/p>

000000F9~00000104Q?/strong>

IEND数据块,q部分正如上所_(d)通常都应该是

00 00 00 00 49 45 4E 44 AE 42 60 82

x(chng)Q我们已l能够从一个PNG文g中识别出各个数据块了(jin)。由于PNG中规定除关键数据块外Q其它的辅助数据块都为可选部分,因此Q有?jin)这个标准后Q我们可以通过删除所有的辅助数据块来减少PNG文g的大。(当然Q需要注意的是,PNG格式可以保存囑փ中的层、文字等信息Q一旦删除了(jin)q些辅助数据块后Q图像将失去原来的可~辑性。)(j)

删除?jin)辅助数据块后的PNG文gQ现在文件大ؓ(f)147字节Q原文g大小?61字节Q文件大减后Qƈ不媄(jing)响图像的内容?/p>

如上说过QIDAT数据块是使用?jin)LZ77压羃法生成的,׃受限于手机处理器的能力,因此Q如果我们在生成IDAT数据块时仍然使用LZ77压羃法Q将?x)效率大打折扣Q因此,Z(jin)效率Q只能用无压羃的LZ77法Q关于LZ77法的具体实玎ͼ此文不打深IӞ如果你对LZ77法的JAVA实现有兴,可以参考以下两个站点:(x)

参考资料:(x)

PNG文g格式白皮书:(x)http://www.w3.org/TR/REC-png.html
为数不多的中文PNG格式说明Q?a target="_blank">http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm
RFC-1950(ZLIB Compressed Data Format Specification)Q?a href="ftp://ds.internic.net/rfc/rfc1950.txt" target="_blank">ftp://ds.internic.net/rfc/rfc1950.txt
RFC-1950(DEFLATE Compressed Data Format Specification)Q?a href="ftp://ds.internic.net/rfc/rfc1951.txt" target="_blank">ftp://ds.internic.net/rfc/rfc1951.txt
LZ77法的JAVA实现Q?a target="_blank">http://jazzlib.sourceforge.net/
LZ77法的JAVA实现Q包括J2ME版本Q?a target="_blank">http://www.jcraft.com/jzlib/index.html



]]>
【{贴】游戏中的资源打?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/19/15412.html</link><dc:creator>李锦?/dc:creator><author>李锦?/author><pubDate>Sun, 19 Nov 2006 00:11:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/19/15412.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15412.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/19/15412.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15412.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15412.html</trackback:ping><description><![CDATA[ <span id="xxfjvpp" class="content">  本h正在准备做一个游戏引擎(你就当我准备产生垃圾好了(jin)~呵呵Q)(j)Q准备写文档Q就Z把这文章写出来?jin),初次发稿Q写得可能不是很好,请多多包涵~谢谢Q~~<br /><br />  资源打包是一些零资源(如图片,音乐文gQ。打包的好处有哪些呢Q?br /><br />  1、减碎片。因为WINDOWS的文件管理系l的原因Q将q些资源按原h在硬盘里Q会(x)产生“碎片”。比?个字节的文gQ占用的I间高?KB。这P资源可以说“膨胀”了(jin)?br /><br />  2、安全。将q些数据集合h打包的话Q就可以隐藏q些文gQ让用户不能修改Q如果某位高手破解了(jin)文gl构q提取出来了(jin)的话你当我没说~Q?br /><br />  我想到的只有q些Q如果哪位大虾认可以补充的,误pLQ)(j)<br /><br />  好了(jin)Q我们现在来构造一个结构来储存q些文g吧!在这里因为我准备写的是只储存囑Ş的游戏引擎,所以我惛_的只是图片的储存Q其他文件的储存Q这里没有涉?qing)?br />  <br />  我们先构造一个文件头Q这个文件头描述?jin)一些基本的信息Q有长度Q文件版本,压羃cdQ还有储存的囄L。现在详l的说一下,长度׃用说?jin)吧Q文件头的大。文件版本是l打包工L(fng)的东东,游戏引擎里也可以使用Q根据版本来用不同的Ҏ(gu)打开文gQ不同的l构Q或者其他的Q。压~类型是一个以备扩展用的东东,Ҏ(gu)标识来用不同的压羃Ҏ(gu)解压~,在这里可以选一个速度和容量折?sh)的压羃?gu)。图片L说的不是单个囄的LQ而是?rn)态图片和动态图片的LQ静(rn)态图片可以理解成一个图片,动态图片就是一pd?rn)态图片的集合Q这个在后面?x)说到。讲一个文件头p?jin)这么多话。我讲得是太详细?jin)还是太水?jin)Q?br /><br />  struct FileHeader<br /><br />  {<br /><br />  unsigned long headsize; //文g头长?br /><br />  int Version; //文g版本<br /><br />  int Compress; //压羃cd<br /><br />  int AllNumber; //囄L<br /><br />  }<br /><br />  然后紧跟一个结构数l,q个l构描述?jin)每个图片的起始偏移量,q个偏移量是以文件头的长?索引l构数组的长?1为基址的,q描qC(jin)囄的敎ͼ?则表CZؓ(f)?rn)态图片,大于1则表C动态图片(动态图片很有用处,比如面Q被风吹动的?wi),q些可以很Ҏ(gu)的表C出来)(j)<br /><br />  struct PicIndex<br /><br />  {<br /><br />  int offset; //囄偏移?br /><br />  unsigned long PicSize //囄长度Q如果是多的则代表q个囄集的d长度Q?br /><br />  int nFrameNumber; //囄帧数<br /><br />  unsigned long nFrameSize[nFrameNumber]; //每一帧的偏移量,q里的偏U量是基址+offset+q一个偏U量。?··%…!天书Q?br /><br />  //当然上面q个数组定义~译时不能这样写<br /><br />  }<br /><br />  PicIndexl构是一个数l,它的下标为AllNumber个。例如:(x)<br /><br />  PicIndex Index[AllNumber];<br /><br />  然后剩下的就是一些数据了(jin)Q这些数据已l被压羃?jin),压羃方式通过文g头的AllNumber变量来获得?br /><br />  <br /><br />  下标n其实是AllNumberQ这里ؓ(f)?jin)省I间Q)(j)<br /><br />  值得注意的是后面的压~数据不是整块压~的Q而是单个囄的压~,然后攑֜一赯(g)已Q我q样做是Z(jin)d方便Q就不用d一个数据还要把整个文g再解压羃一道了(jin)Q这样压~率可能也会(x)降低Q不知道是否q有更好的办法,如果有,误pL~谢谢Q?br /><br />  除了(jin)我写的这U结构方式来储存文g以外Q还有其他的实现Ҏ(gu)Q但是我觉得q个好一炏V?br /><br />  代码我刚写一半,q(sh)完全Q所以这里就不放上来?jin)?br /><br />  我的QQQ?93277421<br /><br />  我再说一句最重要的话Q有I常联系~~~~~~~~<br /></span> <img src ="http://www.shnenglu.com/mybios/aggbug/15412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?/a> 2006-11-19 08:11 <a href="http://www.shnenglu.com/mybios/archive/2006/11/19/15412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】通用型游戏资源提取工具介l?Q推荐)(j)http://www.shnenglu.com/mybios/archive/2006/11/19/15410.html李锦?/dc:creator>李锦?/author>Sun, 19 Nov 2006 00:09:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/19/15410.htmlhttp://www.shnenglu.com/mybios/comments/15410.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/19/15410.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15410.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15410.html游戏资源包括?jin)游戏的囄、文字、音乐、动d其他数据资源。虽然很多游戏的资源都是开攄或者采用通用格式压羃的,但也不少游戏是经Ҏ(gu)格式打包q了(jin)Q要惛_到这些资源可以寻找专用的资源提取工具。但q所有游戏都有专门的提取工具。这时可以尝试寻找一些通用的游戏资源提取工兗一般来说这L(fng)工具都能支持大量的游戏文件格式,而且有些工具q有一个强大的功能是可以分析未知的压~格式ƈ提取出里面的囄、音乐、动ȝ资源。同Ӟ一些工h供的写入功能也能令许多玩家在制作MOD、汉化游戏时事半功倍。一ƾ能解包英雄无敌、FIFA、模拟城?jng)、v商王、铁路大亨、极品飞车、模拟h生、古墓丽q众多游戏资源的工L(fng)Ҏ(gu)值得收藏的?br />
在向大家介绍q些工具之前先说一下采用通用ZIP压羃资源的游戏,也就是说要打开它们Ӟ可用winzip,winrar{Y件直接打开。以下收录如有遗漏,Ƣ迎补充?br />
  游戏名              文g后缀?br />18 Wheels Of Steel: Across America   ZIPFS
18 Wheels Of Steel: Pedal To The Metal ZIPFS
Against Rome              DAT
Alpha Black Zero             ABZ
American McGee's Alice          PK3
Battlefield 2               ZIP
Blitzkrieg                PAK
Brothers Pilots 4             PAK
Call of Duty               PK3
Cellblock Squadrons           BOX
Civilization: Call To Power        CTP
Deadly Dozen              ZA
Deadly Dozen 2 Pacific Theater      ZIP
Defiance                 DAT
Desperados: Wanted Dead or Alive    PAC
Dethkarz                ZIP
Duke Nukem Manhatten Project     ZIPFS
El Airplane                ARH
Empire Earth 2              ZIP
Falcon 4                 ZIP
Fallout Tactics              BOS
Far Cry                 PAK
Fire Starter               ZIP
Freedom Fighters            ZIP
Freedom Force vs The 3rd Reich     FF
Freelancer                FLMOD
Great Battles of WWII - Stalingrad    PAK
Hard Truck: 18 Wheels Of Steel      ZIPFS
Heavy Metal FAKK 2           ZIP
Hellhog XP                A
Hitman Contracts            ZIP
Hitman 2 Silent Assasin         ZIP
Hot Rod American Street Drag      ROD
Hunting Unlimited            ZIP
Imperial Glory              ZIP
Itch                   PSH
Jedi Knight / JK Mysteries Of The Sith   ZIP
Jedi Academy / Outcast         PK3
Law And Order 3            ZIP
Lionheart                DAT
Master of Orion 3            MOD
Medal Of Honor: Allied Assult      PK3
Monte Christo             ZIP
Outfront                PAK
Packmania 2              ARF
Perimeter                PAK
Quake 3                PK3
Return To Castle Wolfenstein      PK3
Revenant                RVI RVM RVR
Richard Burns Rally           RBZ
Ricochet / Ricochet Xtreme        ZIP DAT
Sabotain                ZIP
Serious Sam              GRO
Shadow Warrior            SHR
Shark: Hunting The Great White     ZIPFS
Soldier Of Fortune 2           PK3
Swarm                 DAT
S.W.A.T 3                RES
System Shock 2            CRF
Terminator 3              POD
The Fall - Last Days Of Gaia       UBN
Thief: The Dark Age           CRF
Thief 2: The Metal Age         CRF
Transport Tycoon            001
Tribes 2                ZIP
Uplink                 DAT
Vietnam: Line Of Sight         ZA
Vampire: The Masquerade       NOB
Xpand Rally              PAK
XS Mark                PK1 PK2
Zoo Tycoon              ZTD


以下q单介l一些通用的游戏资源提取工兗?br />
1、Magic Extractor

——游戏资源提取工兗适用于Windows XP/98Q支持将q?00个游戏。界面直观,便易用。要查询它所支持的游戏和文g格式h询:(x)http://magicteam.ag.ru/formats.html。它q有其他的配套工具如QMagic Viewer、Magic Packer。其中Magic Packer用来游戏资源打包压~回厅R缺点就是Magic Packer支持的游戏比Magic Extractor了(jin)很多Qƈ且针Ҏ(gu)个支持的游戏要下载专门的支持文g?br />


2、MultiEx Commander

——游戏资源提取、编辑工兗适用于Windows XP/98Q支持将q?00个游戏,有图片、声韟뀁文本的预览功能。要查询它所支持的游戏和文g格式h询:(x)http://multiex.xentax.com/gameslist.html。其中白色字体表C游戏的资源可以被写入?br />


3、Game Extractor

——游戏资源提取、编辑工兗适用于Windows/Mac OS/Linux/Unix/Solaris{各U环境。运行时需要Java Runtime Environment的支持。该工具支持U?00多个游戏Q提供多U格式文件的预览。完全版q有写入功能Qƈ提供?jin)分析工L(fng)于分析ƈ提取未知格式的游戏文件中的图片、声韟뀁动ȝ资源。要查询它所支持的游戏和文g格式h询:(x)http://www.watto.org/extract/games.html#games?br />


4、Dragon Unpacker

——游戏资源提取工兗适用于Windows XP/98Q支持将q?30个游戏。提供图片、声音的预览和{换(Ҏ(gu)格式转通用格式Q。要查询它所支持的游戏和文g格式h询:(x)http://www.elberethzone.net/index.php?page=dup5&language=en#formats 。它同时提供?jin)一个扫描分析工L(fng)于分析未知格式的游戏文g中的囄、声韟뀁动ȝ资源。该工具没有写入功能?br />


5、Game Archive UnPacker

——游戏资源提取工P用于Total CommanderQ类gWindows资源理器的工具Q的插g。必d安装Total CommanderQ网上有中文版,适用于Windows XP/98。安装时有些ȝ(ch)Q实际上它的使用是最方便的。大家知道XPpȝ引入?jin)ZIP压羃文g夹的功能Q打开ZIP文g像打开普通文件夹一P且在ZIP文g多w可以直接q行各种操作。比M压羃软g都要方便。Game Archive UnPacker插g同样可以让Total Commander实现q种功能。打开游戏资源文g像打开普通文件夹那样单,要提取资源,只要像^帔R样copy文g可以了(jin)。该插g支持U?20个游戏,要查询它所支持的游戏和文g格式h询:(x)http://forrox.narod.ru/gaup_en.htm#supform。对部分游戏该工h供了(jin)文g格式转换的功能,例如游戏特D格式的囄转换为通用格式的图片。该工具没有写入功能?br />

6、Game File Explorer

——游戏资源提取工P提供声音、图片的预览和图片{换功能,支持U?0个游戏,没有什么突出的特点。相关信息请查询Q?a target="_blank">http://www.geocities.com/TimesSquare/8271/index.html


7、Wombat Game Tools

——游戏资源提取、编辑工兗支持的游戏较少Q只有约50个,主要是老游戏,较新的也只有《席h?dng)的L(fng)》。该工具然有文仉览、写入功能。但仍然支持的不是很好。具体请查询Q?a target="_blank">http://www.szevvy.com/content.php?content.1

* 以上有的工具提供?jin)扫描分析未知游戏文件压~格式的功能。但其ƈ非万能,成百上千个游戏能自动分析出来10几个很不错?jin)。而且有时只能分析出文件的一部分而已。用时不要抱太大期望?br />
* 有些工具可以很好的识别同一pd游戏文g的压~格式。例如MultiEx Commander、Game Extractor和Dragon Unpacker都支持Port RoyaleQv商王Q的.cpr文gQ它们同样也能很好的支持游戏列表中没有的Port Royale 2?cpr文g。但Magic Extractor׃行,它可以支持Port RoyaleQ却不能很好的支持Port Royale 2Q可以打开资源文gQ但不能识别完整Q,因此选用时应注意?br />


 (tng)  (tng)  (tng)  (tng)  (tng)  (tng) 若大家还知道哪些通用型的游戏资源提取工具Q欢q补上来?br />

]]>
91ƷۺϾþþƷ| þ޾ƷƵ| ˼˼þúúȾƷ| þþþþŮ | ۺһ˾þþƷ| þþþþþþ| ĻþþƷ1| þþƷ˹ҹ| ݺݾþ| Ļþһ| ŮþþƷ㽶69| Ʒþ»| þþþӰԺ| þþWWWѾƷ| ޾Ʒ99þ| ƷþëƬ| þþþ99ƷƬŷ| ˾þþƷ鶹| Ļþ| þˬƬav| ޹Ʒþһ| ޾Ʒҹvaþ| þþþAVƬ| þۺϾɫۺϾ99| þþƷһպAV| ˾ҹվھƷþþþþþþ | þþƷ˵| ƷŮþAV| ŷһþþƷ޾Ʒþþþ | ٸƷþ| þAVӰ| þ99Ʒþþþþˮ| þѹƷ| þþþƷ| ٸþþþþñŪ߳| þþƷѹۿ97| Ʒ԰״̼þþ| ۺϾþþƷɫ| þþƷ| ҹƷþþþþþþ| ޹Ƶþ|