• <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

            低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

            游戲資源包簡單設計

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

            網絡游戲資源包有個顯著的需求就是支持補丁包更新。更新程序會把補丁包內的更新資源文
            件插入到老的資源包里。最簡單的解決辦法,就是在包文件頭里預留一定的空間,用于將來
            插入新的文件描述。當然,新的文件內容可以直接插入到包尾。一個簡單的文件格式如下:

            pkg_fmt

            pkg_header是一個對整個資源包綜合描述的結構,可能包含的域為:

            struct PkgHeader {
                int ver; /* 版本號 */
                int ctx_offset; /* 文件內容偏移 */
                int file_tag_cnt; /* 文件標記數量 */
                int empty_tag_cnt; /* 空標記數量 */
            };

            pkg_header后面則是文件標記(信息)結構體集合,每一個標記用于描述打包的一個文件的
            信息,可能包含的域有:

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

            如果要支持客戶端自己下載數據更新,考慮到斷點續傳功能,可能還會添加一些成員用于標
            記當前文件獲得的數據大小。

            empty_tags則是一些空的FileTag。當要往包里插入新的文件時,則會在這里申請。同樣,
            如果要刪除文件,也可以將前面的file_tag轉移過來。因為采取這種包格式,文件實際內容
            的偏移基本上是不會改變的,所以,每一次都可以直接重新排列file_tags和empty_tags。

            接下來包的內容就直接是文件內容。如果中間的文件大小有變化,會涉及到其他文件數據的
            移動。

            對于只需要讀取資源包的游戲客戶端而言(不包括更新程序),可以只讀取pkg_header和
            file_tags。程序將file_tags置于一個索引表中,效率考慮,可以標記每一個file_tag是否
            已在內存中。每一次應用層請求一個資源文件時,就從該表中查找。若資源已在內存中,就
            直接取出使用,否則根據file_tag的描述從資源包里取出(這里涉及到IO操作)。

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

            評論

            # re: 游戲資源包簡單設計 2010-06-21 09:40 飯中淹


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

              回復  更多評論   

            # re: 游戲資源包簡單設計 2010-06-21 11:36 Kevin Lynx

            @飯中淹
            對啊,好方法。移動分配表的代價比移動文件內容小多了。不錯。  回復  更多評論   

            # re: 游戲資源包簡單設計 2010-06-23 15:28 秒大刀

            可以研究下其他已有的開源包結構zip、rar、7z等,魔獸的mpq也不錯  回復  更多評論   

            # re: 游戲資源包簡單設計 2010-07-08 17:47 大蝦

            如何實現替換文件?  回復  更多評論   

            # re: 游戲資源包簡單設計 2010-07-09 09:26 Kevin Lynx

            @大蝦
            把文件內容直接替換了,然后修改file_tag  回復  更多評論   

            国产精品gz久久久| 女人高潮久久久叫人喷水| 伊人久久一区二区三区无码| 久久中文娱乐网| 97香蕉久久夜色精品国产| 婷婷久久综合九色综合九七| 久久99精品久久久久久不卡| 国内精品久久久久久久涩爱| 国产精品九九久久免费视频 | 久久男人中文字幕资源站| 99久久精品影院老鸭窝| 国产情侣久久久久aⅴ免费| 久久精品国产亚洲AV高清热| 无码专区久久综合久中文字幕| 国内精品人妻无码久久久影院导航| 久久无码AV一区二区三区| 久久精品国产久精国产果冻传媒| 亚洲中文字幕无码久久综合网| 亚洲AV无码久久精品狠狠爱浪潮| 欧美噜噜久久久XXX| 久久国产高清字幕中文| 很黄很污的网站久久mimi色| 日韩影院久久| 久久天堂AV综合合色蜜桃网| 久久青青草原国产精品免费| 久久精品无码一区二区三区日韩| 亚洲国产成人久久综合一区77| 久久久噜噜噜久久中文字幕色伊伊 | 久久嫩草影院免费看夜色| 免费无码国产欧美久久18| 久久国产精品成人影院| 国产成人精品久久亚洲高清不卡 | 性高湖久久久久久久久AAAAA| 蜜臀久久99精品久久久久久小说 | 伊人久久大香线蕉无码麻豆| 7777精品久久久大香线蕉| 久久亚洲国产午夜精品理论片| 伊人久久大香线蕉无码麻豆| 91精品国产色综合久久| 亚洲AⅤ优女AV综合久久久| 久久精品九九亚洲精品|