游戏中的资源管理——资源高速缓存(转) - CSDN博客
游戏中的资源管理——资源高速缓存(转)
1.什么是资源高速缓存资源高速缓存的原理与其它内存高速缓存的工作原理是相似的。在游戏的状态转换过程中,有些数据是刚才使用过的,那么直接从资源高速缓存中载入即可。例如,RPG游戏中主角从大地图进入一个房间,探索一番后主角退出房间,此时只要直接从缓存中载入大地图数据即可,节省了从硬盘载入数据的时间,要知道从硬盘载入数据是非常慢的。当然,如果你的游戏所使用的数据文件很少,那么你可以在游戏运行过程中把这些数据完全储存在内存中,而不使用资源高速缓存。
2.一个简单的资源高速缓存管理器下面我将向你展示一个比较简单的资源高速缓存管理器,源代码来自我上一个游戏,如果你需要知道更多关于资源高速缓存方面的知识,请参考&&的第八章。首先,需要一个机制来唯一标识一个资源,我们用下面这个结构来做资源句柄:struct ResHandle{ResHandle(std::string &resName, void *buffer, int size){m_resName = resNm_size =m_buffer =}
~ResHandle(){if (m_buffer != 0) delete[] m_}
std::string m_resN //资源名void *m_ //资源句柄所标识的资源DWORD m_ //资源所占内存大小};好了,现在我们可以从资源名来找出这个资源了,接下来实现这个资源高速缓存管理器:class CacheManager{public:CacheManager();~CacheManager();
//载入资源,resName为资源名,若载入成功size被设为该资源的大小//注意,管理中的资源不能在管理器外用delete显示的删除它void* Load(std::string resName, DWORD *size = 0);//设置缓存大小,单位MBvoid SetCacheSize(int sizeMB) { m_cacheSize = sizeMB * 1024 * 1024; }//得到缓存大小,单位MBint GetCacheSize() { return m_cacheSize / ; }
private:void Free(); //释放lru链表中最后一个资源void *Update(ResHandle *res); //更新lru链表ResHandle *Find(std::string &resName); //找出该资源名的资源句柄
private:DWORD m_cacheS //缓存大小DWORD m_ //已使用的缓存大小
//lru链表,记录最近被使用过的资源std::list m_ //资源标识映射 std::map m_};
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_return Update(handle);}else{//先检测资源大小DWORD _size = 资源大小;
//是否有足够空间?while (_size & (m_cacheSize - m_allocated)){if (m_lru.empty())Free();}m_allocated += _
buffer = new char[_size];//在这里用任何你能想到的办法载入资源文件到buffer&&
//记录当前资源ResHandle *handle = new ResHandle(resName, buffer, _size);m_lru.push_front(handle);m_resources[resName] =
if (size != 0) *size = _}
return 0;}
void CacheManager::Free(){std::list::iterator gonner = m_lru.end();gonner--;ResHandle *handle = *m_lru.pop_back();m_resources.erase(handle-&m_resName);m_allocated -= handle-&m_}
void * CacheManager::Update(ResHandle *res){m_lru.remove(res);m_lru.push_front(res);m_size = res-&m_return res-&m_}
ResHandle * CacheManager::Find(std::string &resName){std::map::iterator it = m_resources.find(resName);if (it == m_resources.end()) return 0;return (*it).}
至此,你已经可以在游戏中缓存任何你想缓存的资源了^_^
3. 资源管理进阶至此你已经可以在游戏中缓存任何你想缓存的资源了,但是你的任务还没完成,当你请求的资源存在于缓存之外时,那个闪耀的硬盘灯可能就是玩家最感兴趣的东西了。因此你必须根据不同的游戏类型使用不同的载入方式:? 一次载入所有东西:适用于任何以界面或关卡切换的游戏? 只在关键点载入资源:很多射击游戏都使用这样的设计,如&半条命&? 持续载入:适用于开放型地图的游戏,如&侠盗猎车手&如果有可能的话,你还可以使用缓存预测机制,当CPU有额外时间的时候可以把未来可能用到的资源载入到资源高速缓存。最后,尽管在游戏的资源管理中资源打包不是必须的,但仍然建议大家把资源文件按类型分别打包到单一的文件中,这将为你节省磁盘空间,从而加快游戏的载入速度。
本文已收录于以下专栏:
相关文章推荐
原文链接:http://blog.csdn.net/u/article/details/
新建文件夹:ResMgr。接着新建三个C#脚本。代码如下:
资源管理包括两个部分
《内存管理》:资源的内存分配
《日志管理》:资源的信息,内存信息都将被记录在日志中
《资源管理》:统一资源
很简单的内存池设计
#ifndef cMemoryP...
这里所说的资源管理不仅仅只是资源打包,它包括了定义和压缩,打包,以及各种性质定义和操作接口.
本章只介绍图像资源管理.
定义文件名:IMGLIB.DAT
在调试版本...
(提示:此文为资源管理常识性知识综合,有经验的读者可以飘过。) 资源管理模块,也叫内容管理模块,是图形引擎的基础组件之一。当然,也是音效引擎,或者说游戏引擎的基本组件之一。这也带来了第一个选...
游戏中总是有大量的素材资源,我们通常的做法是把要用的图片做成图片集,这样做的好处有两点:1.就是可以利用图像空余空间2.就是可以利用OpenGL的2的倍数优化。我们来看看怎么用。
这里我们使用自己的类...
调用kmem_cache_destroy()释放cache。这个函数一般是在模块卸载的时候调用,在调用这个函数之前,cache应该是empty的。调用者必须保证在执行kmem_cache_destro...
一、Cocoa Pods简介
Cocoa Pods是一个负责管理iOS项目中第三方资源的工具,它的项目源代码在Github上面管理,得益于活跃的Github开发者社区大神们的不断维护,从20...
Oracle资源管理器简介
Oracle资源管理器(Oracle Database Resource Manager,以下简称DBRM)管理数据库资源,为不同的会话分配不同的数据库资源。DBR...
原文:/hsinwang/articles/214663.html
RAII是指C++语言中的一个惯用法(idiom),它是“Resource Acqui...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)