• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            loop_in_codes

            低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

            游戲資源包簡(jiǎn)單設(shè)計(jì)

            一般的資源包文件格式基本上是由包文件頭和包內(nèi)容組成。文件頭描述資源包內(nèi)打包的文件
            信息,例如文件名、在資源包里的偏移、大小、壓縮加密相關(guān)信息等;包內(nèi)容則是實(shí)際文件
            打包在一起后的內(nèi)容,可能直接是未打包前文件連續(xù)存放在一起的內(nèi)容,也可能是相同類型
            文件除掉文件頭的內(nèi)容(例如某個(gè)資源包里打包的全部是相同格式的圖片文件,那么這些圖
            片文件被打包后包內(nèi)只需要保存一個(gè)圖片文件頭,包內(nèi)容全部是直接的圖片數(shù)據(jù))。

            網(wǎng)絡(luò)游戲資源包有個(gè)顯著的需求就是支持補(bǔ)丁包更新。更新程序會(huì)把補(bǔ)丁包內(nèi)的更新資源文
            件插入到老的資源包里。最簡(jiǎn)單的解決辦法,就是在包文件頭里預(yù)留一定的空間,用于將來(lái)
            插入新的文件描述。當(dāng)然,新的文件內(nèi)容可以直接插入到包尾。一個(gè)簡(jiǎn)單的文件格式如下:

            pkg_fmt

            pkg_header是一個(gè)對(duì)整個(gè)資源包綜合描述的結(jié)構(gòu),可能包含的域?yàn)椋?

            struct PkgHeader {
                int ver; /* 版本號(hào) */
                int ctx_offset; /* 文件內(nèi)容偏移 */
                int file_tag_cnt; /* 文件標(biāo)記數(shù)量 */
                int empty_tag_cnt; /* 空標(biāo)記數(shù)量 */
            };

            pkg_header后面則是文件標(biāo)記(信息)結(jié)構(gòu)體集合,每一個(gè)標(biāo)記用于描述打包的一個(gè)文件的
            信息,可能包含的域有:

            struct FileTag {
                char name[128]; /* 包含目錄名的文件名,用于索引,如./model/character.dat */
                int offset; /* 該文件在資源包內(nèi)的偏移 */
                int size; /* 在資源包中的大小 */
                int orig_size; /* 原始大小,即未壓縮/加密前大小 */
                int crc; /* crc校驗(yàn) */
            };

            如果要支持客戶端自己下載數(shù)據(jù)更新,考慮到斷點(diǎn)續(xù)傳功能,可能還會(huì)添加一些成員用于標(biāo)
            記當(dāng)前文件獲得的數(shù)據(jù)大小。

            empty_tags則是一些空的FileTag。當(dāng)要往包里插入新的文件時(shí),則會(huì)在這里申請(qǐng)。同樣,
            如果要?jiǎng)h除文件,也可以將前面的file_tag轉(zhuǎn)移過(guò)來(lái)。因?yàn)椴扇∵@種包格式,文件實(shí)際內(nèi)容
            的偏移基本上是不會(huì)改變的,所以,每一次都可以直接重新排列file_tags和empty_tags。

            接下來(lái)包的內(nèi)容就直接是文件內(nèi)容。如果中間的文件大小有變化,會(huì)涉及到其他文件數(shù)據(jù)的
            移動(dòng)。

            對(duì)于只需要讀取資源包的游戲客戶端而言(不包括更新程序),可以只讀取pkg_header和
            file_tags。程序?qū)ile_tags置于一個(gè)索引表中,效率考慮,可以標(biāo)記每一個(gè)file_tag是否
            已在內(nèi)存中。每一次應(yīng)用層請(qǐng)求一個(gè)資源文件時(shí),就從該表中查找。若資源已在內(nèi)存中,就
            直接取出使用,否則根據(jù)file_tag的描述從資源包里取出(這里涉及到IO操作)。

            posted on 2010-06-19 14:59 Kevin Lynx 閱讀(4712) 評(píng)論(5)  編輯 收藏 引用 所屬分類: game develop

            評(píng)論

            # re: 游戲資源包簡(jiǎn)單設(shè)計(jì) 2010-06-21 09:40 飯中淹


            另外,文件分配表的位置最好放在包末尾,這樣就沒(méi)有數(shù)量限制了,也不用預(yù)留empty_tags。

              回復(fù)  更多評(píng)論   

            # re: 游戲資源包簡(jiǎn)單設(shè)計(jì) 2010-06-21 11:36 Kevin Lynx

            @飯中淹
            對(duì)啊,好方法。移動(dòng)分配表的代價(jià)比移動(dòng)文件內(nèi)容小多了。不錯(cuò)。  回復(fù)  更多評(píng)論   

            # re: 游戲資源包簡(jiǎn)單設(shè)計(jì) 2010-06-23 15:28 秒大刀

            可以研究下其他已有的開源包結(jié)構(gòu)zip、rar、7z等,魔獸的mpq也不錯(cuò)  回復(fù)  更多評(píng)論   

            # re: 游戲資源包簡(jiǎn)單設(shè)計(jì) 2010-07-08 17:47 大蝦

            如何實(shí)現(xiàn)替換文件?  回復(fù)  更多評(píng)論   

            # re: 游戲資源包簡(jiǎn)單設(shè)計(jì) 2010-07-09 09:26 Kevin Lynx

            @大蝦
            把文件內(nèi)容直接替換了,然后修改file_tag  回復(fù)  更多評(píng)論   

            中文字幕无码久久人妻| 久久精品国产亚洲AV嫖农村妇女| 久久精品国产亚洲AV影院| 精品欧美一区二区三区久久久| 久久夜色精品国产www| 亚洲精品乱码久久久久久久久久久久| 精品国产乱码久久久久久人妻 | 好久久免费视频高清| 91亚洲国产成人久久精品| 欧美日韩精品久久免费| 伊人久久大香线焦综合四虎| 久久久91人妻无码精品蜜桃HD| 亚洲综合伊人久久综合| 国产精品成人99久久久久 | 亚洲国产精品久久久久婷婷软件| 精品乱码久久久久久夜夜嗨| 久久丫精品国产亚洲av不卡 | 97精品国产97久久久久久免费| 国产美女久久精品香蕉69| 欧美伊人久久大香线蕉综合| 四虎国产精品免费久久久| 久久99精品久久久久久久不卡| 精品久久久久久无码免费| 精品久久久久久亚洲精品| 久久久亚洲裙底偷窥综合| 精品久久久久久无码中文野结衣 | 色欲久久久天天天综合网| 久久久久久国产精品免费免费| www性久久久com| 国产精品99久久久久久宅男小说| 国内精品久久久久影院网站| 狠色狠色狠狠色综合久久| 久久香综合精品久久伊人| 久久无码专区国产精品发布| 欧美亚洲另类久久综合婷婷| 婷婷久久精品国产| 国产亚州精品女人久久久久久| 91精品婷婷国产综合久久| 一级做a爰片久久毛片16| 国产亚洲精午夜久久久久久| 91久久福利国产成人精品|