??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品成人一区二区三区,久久精品国产久精国产果冻传媒,亚洲&amp;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我认ؓQ在游戏中另外一个速度Q游戏装入的速度也同样不可轻视。试想一个游戏,动不动就要装入数据,而且每次装入的时间都令h{到“心来慌”的地步Q我x怕也没有什么h愿意玩下ȝ?br /><br />  选择一个好的打包数据格式,对于~程人员来说Q是一件很重要的事情。一般来_一个游戏的文g个数太多Qƈ不是一件好事情Q不光占用的盘I间大,而且严重的媄响装入速度。不q这样做的优点也很明显:可以很详l的分类Q可以大大的减小~程人员的工作量。另外一U做法是Q把所有的数据全部攑֜一个文仉面,q样的做法和上面一U做法的优缺Ҏ好相反,装入速度比较快(因ؓ只要做一ơ文件打开的操作)Q但是由于所有数据都攑֜一P文g数据的组l比较复杂,要求~程人员p大量的精力去定位数据的格式和存放位置。因此,选择一个合适的数据打包格式Q实际上是在这两种情况之间选择一个^衡点Q它既不会Ҏ戏的装入速度造成明显的媄响,也不会给~程人员带来额外的负担?br /><br />  那么Q对于一个游戏来_数据应该怎么l织呢?其实现在有很多好的游戏,参考一下他们的数据文g׃发现q个q点其实很好找。现在大多数的游戏,基本上把游戏需要用到的数据分门别类的存放,每一cL据放在一个文仉面。比如说音乐攑֜一个文仉面,地Ş囄攑֜一个文仉面,_造型、动L在一个文仉面,游戏需要用到的囄攑֜一个文仉面,人物的对话、事件说明放在一个文仉面……那么这些数据在文g里面怎么l织呢?<br /><br />  q是一句话Q分门别cR下面以游戏最基本的地形图素ؓ例,说明数据的组lŞ式。一般说来,游戏的地囄很多大大小的“图素”组成的Q这些图素分为几层,每一层的囄基本上可以算作一c:比如说地面层可以作一c,C层可以算作一c,然后天空层(背景层)可以作一c,部队、物品可以算作一cR而在地面层里面,又可以进一步的分类Q比如说地Ş有山圎ͼ沙漠Q草原,林Q河,h……在游戏中,是可以分为场景的Q一般的情况下,每个场景所涉及到的地Ş不会很多QL以某一cd型地行ؓ主,然后加入量其他的地形作为点~。针对这U情况,我们可以把同一cȝ地Şq箋的放在文件的某一个位|,q样我们在装入场景的时候,只要在这个位|一ơ读取这U地形的数据可以了。一般游戏在制作的过E中都有一个场景生成器Q或者叫作拚囑֙Q它的作用就是生成地䏀—或者说生成场景。这个拚囑֙在初期的时候读人的数据肯定不是已经打包了的Q因为美术还要对地Ş的基本图素进行某些修攏V?br /><br />  所以我认ؓQ好的数据打包格式应该是Z拚图器的Q他把每一U数据分门别cȝq箋存放在某一个文件之中或者文件的某一个位|,q样能够大大的加快程序读取数据的速度。这样几能够使游戏文件看h很简z,也会大大的有利于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">  我们在市ZC一个游戏,很少会轻易的看到游戏目录里一堆的BMPQPCX资源囄。难道他们不使用BMP之类的文件作为图片资源吗Q非也,其实他们把这些资源图片进行了打包、压~?br /><br />  丑և个游戏的例子吧,大名鼎鼎westernwood的《红色警戒》的.mix文g是一U压~包Q里面包含了一堆堆的游戏图片,声音{资源。还有blizzard的《星际争霸》、《暗黑破坏神》、《魔兽系列》的.mpq文g也是一U压~包Q里面包含了各种游戏使用的资源。几乎所有的游戏都用C压羃包?br /><br />  那么Z么要使用q种压羃包呢Q原因很多,首先是压羃Q游戏中使用的图片等资源都是极其适合压羃的,q样减了游戏的体U。如果把《红色警?》的资源全部解开怿会超q?G。其ơ压~后文g体积的减会带来ȝ速度的显著提高。通常一?M的BMP文g可以被压~到700K以内Q读取一?M的文件和d一?00K的文件然后再内存中解压的速度Ҏ是可惌知的。最后,大量的资源文g打包能得游戏目录清晎ͼ而不是一堆堆的文件夹和文Ӟq样能减磁盘空间的费Q也减少了磁盘碎片?br /><br />说了那么多压~包的好处,我们在游戏中到底怎么使用压羃包呢Q?br />  1Q我们需要定义我们自q压羃包文件存储格式?br />  2Q根?我们写一个压~工hҎ戏中的资源进行压~存储?br />  3Q根?我们写一个解压羃的库以便我们游戏中用?br />  4Q在游戏的代码中Q我们调用这个库Q来d我们包中的文件?br /><br />  看到q儿Q似乎我们需要做的工作还是很多、很复杂的。要定义一个文件结构,又要写压~工兗还要写解压库。而我们真正用确实在最后一步,而且是简单的调用一个库而已。似乎有点得不偿׃。好了,我们现在要找一条捷径来完成我们游戏使用压羃包的问题Q对??来说其实很好办,现成的就有很多压~Y件可以生成压~包Qwinzip,winrar,winace ……都是非常好的压~工Pq样我们不用定义压羃包的存储格式Q也不用~写压羃工具。不费Q何力气就完成??两步。那么第3步又如何呢?文g存储格式不是我们设计的,我们无法知道文g是如何组l、如何压~的Q跟不用说知道如何压~了。不q上|搜索一下,我们q是能得C些winzipQwinrar格式的解压羃源代码的。不q研Ivq些代码来又是g痛苦的事情,更何况还要用在自q游戏里?br /><br />  到这里,我们又遇C严峻的考验Q现在我向大安重介l我们的压u法宝Q?/font> <a > <font size="2">MDFile文gpȝ</font> </a> <font size="2">。那么,MDFile是个什么东东呢QMDFile是一个可扩展的文件操作库Q可以用最最单的Ҏ实现对Q意压~包格式内文件的d。那么到此,我们??也都可以实现了。下面我们就以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点L站原创,扑ֈ</font> <a > <font size="2">MDFile</font> </a> <font size="2">q下载下来?br /><br />  库攑ֈ你的工程中,q设|好Q这里我׃详细说如何设|一个外部的库了Q如果不会的话你可以参考相关的书。好了,下面我们开始我们的代码了,q里以读取test.zip中的一个test.txt文gZQ?br /><br />我们在程序中d一个LoadFile的函数来载入一个包里的文g?br /></font> <font face="宋体" size="2">bool LoadFile(char* filename,char* packfile)<br />{<br />    BYTE* buf=NULL; // 用来存放d出的文g的内?br />    </font> <font face="宋体" size="2">CMD_File cmdfile(“ZipExt.dll?; // 我们先生成一个实?br />    </font> <font face="宋体" size="2">cmdfile.Open(“test.zip?true,true); // 打开test.zipq个压羃?br />    </font> <font face="宋体" size="2">cmdfile.Locate(“test.txt?; // 定位到test.txt文g<br />    </font> <font face="宋体" size="2">buf=new BYTE[cmdfile.GetLength()];// Ҏtest.txt的大分配内?br />    </font> <font face="宋体" size="2">cmdfile.Read(buf); // d文g到我们的内存?br />    </font> <font face="宋体" size="2">// xQbuf中已l存储了我们需要的test.zip中的test.txt文g的内容了<br />    </font> <font face="宋体" size="2">// 是不是很单呢Q?br />}</font> <font face="Arial"> <br /> <br /> <font size="2">l心的朋友可能已l注意到了,</font> </font> <font face="宋体" 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ؓ了让他支持Zip你必获得ZipExt.dllq个扩展库,同样的如果你需要Rar支持你需要获得RarExt.dllq个扩展库。好在我们刚下蝲的MDFile包中已经包括了一个ZipExt.dllQ在Sample\Sample4\Release中)Q也好在@J--S Studio在不停的开发MDFile的扩展库Q以便我们能够用更多的压羃包格式?br /><br />  需要一提的是:使用q些现成的压~Y件制作文件包虽然单,但是也有很多问题Q例如安全性,有时候我们不惌其他人看到游戏中用到的资源,q时如果我们用的是Zip格式Q那可能轻易的被别开q修改了。这Ӟ其实使用MDFile内部的epk格式比较好Q他使用动态加密技术,同时epk格式不被其他压羃软g支持Q另外他的其他一些特性都是非怸错的。同时ؓ了支持epk格式Q他q提供了一个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在游戏中ؓ什么要打包Q有什么意义么Q个为,有以下几个意义:</div> <div align="left">   1.安全性?/div> <div align="left">   如果你的游戏重要数据以文本文件的形式保存在某些文件中Q然而你又不希望玩家随意修改q些数据。(比如某些ini文g之类的)把他们和其他2q制文g全部打包在一L话,q个问题可以避免了?/div> <div align="left">   2.节约盘I间?/div> <div align="left">   文g太多的话Q很Ҏ产生“碎片”。比如一?个字节的文gQ占用空间就高达8Kb。(q个是由windows文g理pȝ军_的)Q如果是很多q样的文Ӟ可能会发生q种情况Qxxxxx个文Ӟ实际大小1xxMb,占用I间3xxMBQ(q里只是打一个比方,实际相差不会那么多)。这也许会让人感觉不舒服?/div> <div align="left">   3.观</div> <div align="left">   单的量文gL一大堆׃八糟的东西更让h觉得舒服?/div> <div align="left">   4.q没惛_...... </div> <div align="left">  下面说说我的设计思\?/div> <div align="left">   打包后的文g该是怎样一U结构呢?</div> <div align="left">   我想到的有以下几U结?</div> <div align="left">   1.   { 文g标示信息 //判断是否是正的打包文g 文g的个?文g索引表大?各个文g的一个烦引表.里面包含每个文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">   3.   { 打包成两个文?一个负责方?的烦引表.另外一个只负责文g内容   }   q里W?U和W三U方式必要得到索引表信息后才能填充文g,不如方式2直截了当.所以我在程序设计的时候采用的是方?.当然方式1,3也有他们的好?比如查找文g?要方便一? </div> <div align="left">  需要压~么?</div> <div align="left">   解压~是要花Ҏ间的.你可以从速度和容量方面做一个折?我在设计的时?没有考虑压羃.   怎样在游戏中从已l打包了的文件读取需要的文g?</div> <div align="left">   最单的Ҏ,得到需要的文g信息,从打包文件中d出来,攑ֈ一个时文件中.dq个临时文g卛_, </div> <div align="left">  游戏l束之前,从程序中删除q个临时文g卛_.q里带来了一个问?性能.每次都要q行I/O操作.如果每个文g都不是非常大的文件的?q个办法q是可以?或则你需要高性能的东?那就只有一个办?把你的程序中所有对文g操作都改到对内存q行操作.q样只要把需要的文g从打包文件中d到内存中卛_.或者还有另外的Ҏ,直接在打包文件中d(q个我还不知道怎么实现,盼望高手赐教?   在制作游戏过E中,当然不用打包,只是在正式版发布?把所有已l做好了的资?比如囄,一些数据文?脚本文g{?打包再一起就可以?cM如下l构</div> <div align="left">   //假设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名ؓ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">   <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格式所不具备的Ҏ。流式网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定义了两U类型的数据块,一U是UCؓ关键数据?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箋
tIME 囑փ最后修Ҏ间数据块 ? ?/td> 无限?
tEXt 文本信息数据? ?/td> ?/td> 无限?
zTXt 压羃文本数据? ?/td> ?/td> 无限?
fRAc (专用公共数据? ?/td> ?/td> 无限?
gIFg (专用公共数据? ?/td> ?/td> 无限?
gIFt (专用公共数据? ?/td> ?/td> 无限?
gIFx (专用公共数据? ?/td> ?/td> 无限?
IEND 囑փl束数据 ? ? 最后一个数据块

Z单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 (循环冗余? 4字节 存储用来是否有错误的@环冗余码

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我们依ơ来了解一下各个关键数据块的结构吧?/p>

IHDR

文g头数据块IHDR(header chunk)Q它包含有PNG文g中存储的囑փ数据的基本信息,q要作ؓW一个数据块出现在PNG数据中Q而且一个PNG数据中只能有一个文件头数据块?/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
真彩色图像:8?6
ColorType 1 byte 颜色cdQ?br />0Q灰度图? 1Q?Q?Q??6
2Q真彩色囑փQ??6
3Q烦引彩色图像,1Q?Q??
4Q带通道数据的灰度图像,8?6
6Q带通道数据的真彩色囑փQ??6
Compression method 1 byte 压羃Ҏ(LZ77z法)
Filter method 1 byte 滤L器方?
Interlace method 1 byte 隔行扫描ҎQ?br />0Q非隔行扫描
1Q?Adam7(由Adam M. Costello开发的7遍隔行扫描方?

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

  • 在MIDP1.0中,我们只可以?.0版本的PNG囄。ƈ且,所以的PNG关键数据块都有特别要求:
    IHDR
  • 文g大小QMIDP支持L大小的PNG囄Q然而,实际上,如果一个图片过大,会由于内存耗尽而无法读取?
  • 颜色cdQ所有颜色类型都有被支持Q虽然这些颜色的昄依赖于实际设备的昄能力。同ӞMIDP也能支持alpha通道Q但是,所有的alpha通道信息都会被忽略ƈ且当作不透明的颜色对待?
  • 色深Q所有的色深都能被支持?
  • 压羃ҎQ仅支持压羃方式0Qdeflate压羃方式Q,q和jar文g的压~方式完全相同,所以,PNG囄数据的解压和jar文g的解压可以用相同的代码。(其实q也是Z么J2ME能很好的支持PNG囑փ的原因:Q)
  • 滤L器方法:管在PNG的白皮书中仅定义了方?Q然而所有的5U方法都被支持!
  • 隔行扫描Q虽然MIDP支持0?两种方式Q然而,当用隔行扫描时QMIDP却不会真正的使用隔行扫描方式来显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)相关的彩色变换数据,它仅与烦引彩色图像有养I而且要放在图像数据块(image data chunk)之前?/p>

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

颜色

字节

意义

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调色板的颜色烦引从0开始编P然后??……,调色板的颜色C能超q色׃规定的颜色数Q如囑փ色深?的时候,调色板中的颜色数不可以超q?^4=16Q,否则Q这导致PNG囑փ不合法?/p>

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

IDAT

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

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

IEND

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

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

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

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

实例研究PNG

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

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

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

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

00000008~00000020Q?/strong>

  • 00 00 00 0D 说明IHDR头块长ؓ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当Ӟ如果颜色C过8Q用03表示更合适)
  • 03 颜色cdQ烦引图?
  • 00 PNG Spec规定此处Mؓ0Q非0gؓ来使用更好的压~方法预留)Q表CZ压羃Ҏ(LZ77z法)
  • 00 同上
  • 00 非隔行扫?
  • 36 21 A3 B8 CRC校验

00000021~0000002FQ?/strong>

可选数据块sBITQ颜色采LQRGB都是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部分包含了pHYs、tExt两种cd的数据块?块,׃q不太重要,因此也不再详l描qC?br />
000000C0~000000F8Q?/strong>

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

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

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

000000F9~00000104Q?/strong>

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

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

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

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

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

参考资料:

PNG文g格式白皮书: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="yoizvum" class="content">  本h正在准备做一个游戏引擎(你就当我准备产生垃圾好了~呵呵Q)Q准备写文档Q就Z把这文章写出来了,初次发稿Q写得可能不是很好,请多多包涵~谢谢Q~~<br /><br />  资源打包是一些零资源(如图片,音乐文gQ。打包的好处有哪些呢Q?br /><br />  1、减碎片。因为WINDOWS的文件管理系l的原因Q将q些资源按原h在硬盘里Q会产生“碎片”。比?个字节的文gQ占用的I间高?KB。这P资源可以说“膨胀”了?br /><br />  2、安全。将q些数据集合h打包的话Q就可以隐藏q些文gQ让用户不能修改Q如果某位高手破解了文gl构q提取出来了的话你当我没说~Q?br /><br />  我想到的只有q些Q如果哪位大虾认可以补充的,误pLQ)<br /><br />  好了Q我们现在来构造一个结构来储存q些文g吧!在这里因为我准备写的是只储存囑Ş的游戏引擎,所以我惛_的只是图片的储存Q其他文件的储存Q这里没有涉及?br />  <br />  我们先构造一个文件头Q这个文件头描述了一些基本的信息Q有长度Q文件版本,压羃cdQ还有储存的囄L。现在详l的说一下,长度׃用说了吧Q文件头的大。文件版本是l打包工L的东东,游戏引擎里也可以使用Q根据版本来用不同的Ҏ打开文gQ不同的l构Q或者其他的Q。压~类型是一个以备扩展用的东东,Ҏ标识来用不同的压羃Ҏ解压~,在这里可以选一个速度和容量折中的压羃Ҏ。图片L说的不是单个囄的LQ而是静态图片和动态图片的LQ静态图片可以理解成一个图片,动态图片就是一pd静态图片的集合Q这个在后面会说到。讲一个文件头p了这么多话。我讲得是太详细了还是太水了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构描述了每个图片的起始偏移量,q个偏移量是以文件头的长?索引l构数组的长?1为基址的,q描qC囄的敎ͼ?则表CZؓ静态图片,大于1则表C动态图片(动态图片很有用处,比如面Q被风吹动的树,q些可以很Ҏ的表C出来)<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个。例如:<br /><br />  PicIndex Index[AllNumber];<br /><br />  然后剩下的就是一些数据了Q这些数据已l被压羃了,压羃方式通过文g头的AllNumber变量来获得?br /><br />  <br /><br />  下标n其实是AllNumberQ这里ؓ了省I间Q)<br /><br />  值得注意的是后面的压~数据不是整块压~的Q而是单个囄的压~,然后攑֜一赯已Q我q样做是Zd方便Q就不用d一个数据还要把整个文g再解压羃一道了Q这样压~率可能也会降低Q不知道是否q有更好的办法,如果有,误pL~谢谢Q?br /><br />  除了我写的这U结构方式来储存文g以外Q还有其他的实现ҎQ但是我觉得q个好一炏V?br /><br />  代码我刚写一半,q不完全Q所以这里就不放上来了?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推荐)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游戏资源包括了游戏的囄、文字、音乐、动d其他数据资源。虽然很多游戏的资源都是开攄或者采用通用格式压羃的,但也不少游戏是经Ҏ格式打包q了Q要惛_到这些资源可以寻找专用的资源提取工具。但q所有游戏都有专门的提取工具。这时可以尝试寻找一些通用的游戏资源提取工兗一般来说这L工具都能支持大量的游戏文件格式,而且有些工具q有一个强大的功能是可以分析未知的压~格式ƈ提取出里面的囄、音乐、动ȝ资源。同Ӟ一些工h供的写入功能也能令许多玩家在制作MOD、汉化游戏时事半功倍。一ƾ能解包英雄无敌、FIFA、模拟城市、v商王、铁路大亨、极品飞车、模拟h生、古墓丽q众多游戏资源的工LҎ值得收藏的?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询:http://magicteam.ag.ru/formats.html。它q有其他的配套工具如QMagic Viewer、Magic Packer。其中Magic Packer用来游戏资源打包压~回厅R缺点就是Magic Packer支持的游戏比Magic Extractor了很多Qƈ且针Ҏ个支持的游戏要下载专门的支持文g?br />


2、MultiEx Commander

——游戏资源提取、编辑工兗适用于Windows XP/98Q支持将q?00个游戏,有图片、声韟뀁文本的预览功能。要查询它所支持的游戏和文g格式h询: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ƈ提供了分析工L于分析ƈ提取未知格式的游戏文件中的图片、声韟뀁动ȝ资源。要查询它所支持的游戏和文g格式h询:http://www.watto.org/extract/games.html#games?br />


4、Dragon Unpacker

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


5、Game Archive UnPacker

——游戏资源提取工P用于Total CommanderQ类gWindows资源理器的工具Q的插g。必d安装Total CommanderQ网上有中文版,适用于Windows XP/98。安装时有些ȝQ实际上它的使用是最方便的。大家知道XPpȝ引入了ZIP压羃文g夹的功能Q打开ZIP文g像打开普通文件夹一P且在ZIP文g多w可以直接q行各种操作。比M压羃软g都要方便。Game Archive UnPacker插g同样可以让Total Commander实现q种功能。打开游戏资源文g像打开普通文件夹那样单,要提取资源,只要像^帔R样copy文g可以了。该插g支持U?20个游戏,要查询它所支持的游戏和文g格式h询:http://forrox.narod.ru/gaup_en.htm#supform。对部分游戏该工h供了文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的L》。该工具然有文仉览、写入功能。但仍然支持的不是很好。具体请查询Q?a target="_blank">http://www.szevvy.com/content.php?content.1

* 以上有的工具提供了扫描分析未知游戏文件压~格式的功能。但其ƈ非万能,成百上千个游戏能自动分析出来10几个很不错了。而且有时只能分析出文件的一部分而已。用时不要抱太大期望?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 />


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

]]>
77777ҹþö| ij뾫Ʒþþò| þӰӹ| 99þ99þþƷƬ| wwwþþcom| avԾþþþa鶹| þۺϾþùɫ| ŷþһwwwwww.| ƷžžþƵ| ھƷþþþþ鶹| ˾þۺ2020| 2021˾Ʒþ| 99þó18վ| ݲݾþþר| պŷþ| þ˿ྫƷĻ| һAvëƬþþƷ| һɫۺϾþ| þþþŷղAV| þþƷ˘AV| þþƷAV뽿ɫ | ɫۺϾþþþ| þþƷһĻ| þeֻйľƷ99| ŷþۺϾɫۺ| ƷۺϾþþþþ97| þþþø߳ëƬȫ| ˾þô߽Ʒ| ŷ˾þô߽ۺ69| ҹþþþüŮӰԺ| 99þerֻоƷ18| ƷþþþӰԺ۲| ѾƷþþþþĻ| þŮcc98cm| 97þۺɫۺɫhd| Ʒþþþþҹҹ| 2021Ʒҹþ| 69ۺϾþþƷ| þ޸ۺ| Ʒþþþþù˽| þþþùһëƬ|