青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

麒麟子

~~

導航

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

統計

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

Friends

WebSites

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

游戲中的資源管理――資源高速緩存

《游戲中的資源管理――資源高速緩存》
轉載請注明出處:http://groups.google.com/group/jianguhan


1.什么是資源高速緩存
    資源高速緩存的原理與其它內存高速緩存的工作原理是相似的。在游戲的狀態轉換過程中,有些數據是剛才使用過的,那么直接從資源高速緩存中載入即可。例如,RPG­游戲中主角從大地圖進入一個房間,探索一番后主角退出房間,此時只要直接從緩存中載入大地圖數據即可,節省了從硬盤載入數據的時間,要知道從硬盤載入數據是非常­慢的。當然,如果你的游戲所使用的數據文件很少,那么你可以在游戲運行過程中把這些數據完全儲存在內存中,而不使用資源高速緩存。


2.一個簡單的資源高速緩存管理器
    下面我將向你展示一個比較簡單的資源高速緩存管理器,源代碼來自我上一個游戲,如果你需要知道更多關于資源高速緩存方面的知識,請參考<<Game Coding Complete>>的第八章。
首先,需要一個機制來唯一標識一個資源,我們用下面這個結構來做資源句柄:
struct ResHandle
{
     ResHandle(std::string &resName, void *buffer, int size)
     {
         m_resName = resName;
         m_size   = size;
         m_buffer = buffer;
     }


     ~ResHandle()
     {
         if (m_buffer != 0) delete[] m_buffer;
     }


     std::string   m_resName;    //資源名
     void          *m_buffer;    //資源句柄所標識的資源
     DWORD         m_size;       //資源所占內存大小


};


好了,現在我們可以從資源名來找出這個資源了,接下來實現這個資源高速緩存管理器:
class CacheManager
{
public:
     CacheManager();
     ~CacheManager();

     //載入資源,resName為資源名,若載入成功size被設為該資源的大小
    //注意,管理中的資源不能在管理器外用delete顯示的刪除它
    void*    Load(std::string resName, DWORD *size = 0);
    //設置緩存大小,單位MB
     void      SetCacheSize(int sizeMB)    { m_cacheSize = sizeMB * 1024 * 1024; }
     //得到緩存大小,單位MB
     int      GetCacheSize()              { return m_cacheSize / 1024 /1024; }


private:
     void     Free();                          //釋放lru鏈表中最后一個資源
     void     *Update(ResHandle *res);         //更新lru鏈表
     ResHandle *Find(std::string &resName);     //找出該資源名的資源句柄


private:
     DWORD m_cacheSize;     //緩存大小
     DWORD m_allocated;     //已使用的緩存大小


//lru鏈表,記錄最近被使用過的資源
     std::list<ResHandle*>                m_lru;  
    //資源標識映射
     std::map<std::string, ResHandle*>    m_resources;

 

};


CacheManager:: CacheManager ()
{
     m_cacheSize = 0;
     m_allocated = 0;


}


CacheManager::~ CacheManager ()
{
          while (!m_lru.empty()) Free();   //釋放所有管理中的資源


}


void * CacheManager::Load(std::string resName, DWORD *size)
{
     ResHandle *handle = Find(resName);   //查找該資源是否在緩存中

     if (handle != 0) //如果找到該資源句柄,則返回該資源并更新lru鏈表
     {
         if (size != 0) *size = handle->m_size;
         return Update(handle);
     }
     else
     {
         //先檢測資源大小
         DWORD _size = 資源大小;


         //是否有足夠空間?
         while (_size > (m_cacheSize - m_allocated))
         {
              if (m_lru.empty()) break;
              Free();
         }
         m_allocated += _size;


         buffer = new char[_size];
//在這里用任何你能想到的辦法載入資源文件到buffer
         …
         …


//記錄當前資源
         ResHandle *handle = new ResHandle(resName, buffer, _size);
         m_lru.push_front(handle);
         m_resources[resName] = handle;


         if (size != 0) *size = _size;
         return buffer;
     }


     return 0;

 

}


void CacheManager::Free()
{
     std::list<ResHandle*>::iterator gonner = m_lru.end();
     gonner--;
     ResHandle *handle = *gonner;
     m_lru.pop_back();
     m_resources.erase(handle->m_resName);
     m_allocated -= handle->m_size;
     delete handle;


}


void * CacheManager::Update(ResHandle *res)
{
     m_lru.remove(res);
     m_lru.push_front(res);
     m_size = res->m_size;
     return res->m_buffer;


}

ResHandle * CacheManager::Find(std::string &resName)
{
     std::map<std::string, ResHandle*>::iterator it = m_resources.find(resName);
     if (it == m_resources.end()) return 0;
     return (*it).second;


}

至此,你已經可以在游戲中緩存任何你想緩存的資源了^_^

3. 資源管理進階
    至此你已經可以在游戲中緩存任何你想緩存的資源了,但是你的任務還沒完成,當你請求的資源存在于緩存之外時,那個閃耀的硬盤燈可能就是玩家最感興趣的東西了。
因此你必須根據不同的游戲類型使用不同的載入方式: 
    一次載入所有東西:適用于任何以界面或關卡切換的游戲 
    只在關鍵點載入資源:很多射擊游戲都使用這樣的設計,如“半條命” 
    持續載入:適用于開放型地圖的游戲,如“俠盜獵車手”
    如果有可能的話,你還可以使用緩存預測機制,當CPU有額外時間的時候可以把未來可能用到的資源載入到資源高速緩存。
    最后,盡管在游戲的資源管理中資源打包不是必須的,但仍然建議大家把資源文件按類型分別打包到單一的文件中,這將為你節省磁盤空間,并加快游戲的載入速度。

posted on 2009-05-17 23:48 麒麟子 閱讀(607) 評論(0)  編輯 收藏 引用 所屬分類: Game and Engine

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美中文字幕第一页| 红桃视频一区| 亚洲欧美日韩国产综合| 亚洲在线观看视频网站| 国产一区 二区 三区一级| 久久久国产精品一区二区中文| 欧美在线视频免费观看| 亚洲激情不卡| 妖精成人www高清在线观看| 国产精品视频yy9099| 久久高清国产| 欧美波霸影院| 午夜一区二区三视频在线观看| 欧美专区亚洲专区| 亚洲美女av在线播放| 亚洲新中文字幕| 尤物九九久久国产精品的分类| 亚洲精品乱码视频| 欧美图区在线视频| 久久久噜噜噜久久中文字免| 欧美国产精品v| 久久国产高清| 欧美日韩亚洲一区三区| 久久久久国产精品麻豆ai换脸| 欧美成人亚洲| 久久频这里精品99香蕉| 欧美少妇一区| 欧美高清不卡| 国产三级精品三级| 日韩午夜av在线| 亚洲国产成人午夜在线一区| 在线视频精品| 亚洲精品一二三区| 久久久爽爽爽美女图片| 亚洲欧美在线另类| 欧美另类极品videosbest最新版本| 欧美中文字幕视频| 欧美日韩在线播| 欧美国产第一页| 欧美亚洲视频在线看网址| 亚洲美女免费视频| 久久久久久久尹人综合网亚洲| 亚洲综合大片69999| 欧美理论视频| 亚洲国产精品va在线看黑人| 狠狠操狠狠色综合网| 亚洲免费综合| 午夜精品久久久| 国产精品成人一区二区三区吃奶| 亚洲高清在线精品| 亚洲激情校园春色| 久久免费黄色| 美女免费视频一区| 在线观看亚洲一区| 久久精品论坛| 久久免费午夜影院| 好吊色欧美一区二区三区视频| 亚洲欧美激情视频| 久久精品99国产精品酒店日本| 国产精品视频1区| 亚洲在线观看免费视频| 小处雏高清一区二区三区| 国产精品久久久久三级| 亚洲淫片在线视频| 久久黄金**| 精品不卡视频| 久久久久青草大香线综合精品| 久久先锋资源| 最新亚洲激情| 欧美精品在线观看播放| 日韩亚洲综合在线| 午夜精品国产更新| 国产中文一区| 免费成人av| 日韩午夜激情| 久久国产精品99国产精| 黑人巨大精品欧美一区二区| 久久久综合香蕉尹人综合网| 亚洲电影在线播放| 亚洲一区二区视频| 国产日韩欧美高清| 美女黄色成人网| 亚洲三级性片| 欧美在线视频一区二区| 激情欧美丁香| 欧美日韩精品国产| 午夜久久电影网| 欧美成人免费小视频| 亚洲视频欧美在线| 国产午夜一区二区三区| 欧美成人午夜剧场免费观看| 一区二区三区色| 欧美~级网站不卡| 亚洲综合色丁香婷婷六月图片| 国产亚洲欧美中文| 欧美激情1区2区| 性做久久久久久免费观看欧美| 欧美国产欧美亚洲国产日韩mv天天看完整 | 91久久视频| 午夜亚洲精品| 亚洲经典在线| 国产欧美日韩免费看aⅴ视频| 免费黄网站欧美| 新片速递亚洲合集欧美合集| 美女久久网站| 久久都是精品| 亚洲免费婷婷| 欧美日韩成人综合在线一区二区 | 久久综合久久久久88| 一区二区高清| 欧美华人在线视频| 久久高清免费观看| 亚洲系列中文字幕| 最新亚洲视频| 在线成人av网站| 国产精一区二区三区| 欧美日本国产视频| 久久综合伊人| 久久精品成人| 翔田千里一区二区| 亚洲视频一区二区| 亚洲精品一区二| 亚洲夫妻自拍| 欧美成人一区二区三区| 久久在精品线影院精品国产| 亚洲在线1234| 亚洲一区影音先锋| 亚洲午夜精品在线| 一区二区三区www| 日韩天堂在线观看| 91久久在线观看| 亚洲第一天堂无码专区| 黄色小说综合网站| 国模精品娜娜一二三区| 国产视频观看一区| 国产欧美日韩一区二区三区| 国产精品美女xx| 国产精品爽黄69| 国产精品专区第二| 国产精品亚洲综合一区在线观看| 国产精品每日更新| 国产精品男gay被猛男狂揉视频| 欧美日韩在线免费视频| 欧美视频在线免费看| 欧美日韩午夜视频在线观看| 欧美日韩精品一区二区天天拍小说| 欧美精品在线视频| 国产精品yjizz| 国产精品入口| 国内精品久久久久影院色| 黑人巨大精品欧美一区二区| 在线观看三级视频欧美| 91久久久国产精品| 在线一区二区日韩| 欧美一区日韩一区| 久久久亚洲精品一区二区三区 | 久久av在线看| 狂野欧美激情性xxxx欧美| 麻豆乱码国产一区二区三区| 欧美伦理一区二区| 国产精品一区二区三区久久| 国外成人性视频| 亚洲欧洲精品成人久久奇米网| 一本久道久久综合婷婷鲸鱼| 亚洲一级黄色片| 久久久久久成人| 91久久精品日日躁夜夜躁欧美| 99热精品在线观看| 久久精品99| 欧美激情一区二区三区| 国产精品成人在线观看| 国产欧美午夜| 日韩视频第一页| 性色av香蕉一区二区| 亚洲大胆美女视频| 亚洲中午字幕| 欧美成人高清视频| 国产日韩欧美综合一区| 亚洲欧洲综合| 久久精品视频99| 亚洲精品视频中文字幕| 欧美aⅴ一区二区三区视频| 亚洲免费观看| 久久久噜噜噜| 国产精品免费久久久久久| 亚洲国产第一| 久久精品国产视频| 99国产精品国产精品毛片| 久久精品国产久精国产思思| 欧美私人网站| 亚洲三级影片| 另类激情亚洲| 欧美一级淫片播放口| 欧美日韩国产免费| 亚洲国产欧美日韩精品| 久久精品亚洲精品| 亚洲午夜日本在线观看| 欧美精品国产精品日韩精品| 影音先锋国产精品| 久久精品中文|