`
abobchina
  • 浏览: 5712 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

游戏中的资源管理----资源高速缓存

 
阅读更多
来源:http://www.cppblog.com/Leaf/archive/2009/05/17/83230.html



《游戏中的资源管理――资源高速缓存》
转载请注明出处: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有额外时间的时候可以把未来可能用到的资源载入到资源高速缓存。
    最后,尽管在游戏的资源管理中资源打包不是必须的,但仍然建议大家把资源文件按类型分别打包到单一的文件中,这将为你节省磁盘空间,并加快游戏的载入速度。
分享到:
评论

相关推荐

    09配置+servlet+高速缓存

    配置 servlet 高速缓存以将 servlet 的输出和 JavaServer Pages(JSP)文件保存到动态高速缓存中。 在您开始之前 要启用 servlet 高速缓存,您必须完成 启用动态高速缓存服务 。 关于本任务 每次 servlet 运行时...

    oracle10g课堂练习II(1)

    PGA 管理资源 8-30 使用内存指导调整 SGA 的大小 8-31 使用内存指导调整 PGA 的大小 8-32 有效使用内存:准则 8-33 库高速缓存的内存优化准则 8-35 小结 8-37 练习概览:使用 ASMM 纠正内存分配问题 8-38 9...

    fw-control-plane:使节控制平面使用简单的文件监视机制来填充高速缓存

    这是envoy的一个简单控制平面,该控制平面从文件系统上的文件中提取xDS数据。 它使用java-control-plane维护配置快照并管理向侦听使节传播的配置更改,并使用文件监视功能监视配置文件的更新。 java-controle-plane...

    qlib服务器:Qlib服务器是Qlib的数据服务器系统。 它使Qlib在联机模式下运行。 在联机模式下,数据将被部署为共享数据服务。 数据及其缓存将由所有客户端共享。 由于较高的高速缓存命中率,因此有望提高数据检索性能。 它也会消耗更少的磁盘空间

    由于较高的高速缓存命中率,因此有望提高数据检索性能。 它也会消耗更少的磁盘空间。 综上所述, Qlib-Server旨在解决以下问题: 集中管理数据,这使得数据管理(包括缓存管理,日期更新)更加容易。 减少要生成...

    高速电影程序GsCms v1.5 utf8.zip

    经过近多年的开发经验和技术积累,高速GsCMS视频电影程序已逐步走向成熟,在易用性和功能上已经成为同行中的佼佼者。   程序体积小-&gt;优化程序代码,运行速度快-&gt;高效的缓存处理,只要普通的虚拟主机就可以完美...

    UNIX-IBMAIX5L参考-性能管理指南.chm

    资源管理概述 处理器调度程序性能概述 虚拟内存管理器(VMM)性能概述 固定磁盘存储管理的性能概述 对暂存内存的支持 大页面支持 多处理介绍 对称多处理器(SMP)概念和体系结构 SMP 性能问题 SMP 工作负载 SMP 线程...

    aiCache-HTTP和HTTPS加速软件

    aicache是一种基于epoll机制,利用RAM做高速缓存,动态缓存加速,高性能稳定的web服务器加速,网站加速软件。可显著使服务器减荷,节省服务器资源,缓解访问压力,提高访问速度。 性能卓越的智能化动态微缓存: ...

    Linux内核情景分析

    9.3 高速缓存与内存的一致性 9.4 SMP结构中的中断机制 9.5 SMP结构中的进程调度 9.6 SMP系统的引导 第10章 系统引导和初始化 10.1 系统引导过程概述 10.2 系统初始化(第一阶段) 10.3 系统初始化(第二阶段) ...

    毕业设计- 车辆租赁管理系统(源代码+说明)

    2. 降低成本:系统可以减少人力资源和物质资源的浪费,使企业在生产和管理上节约成本,提高企业效益。 3. 提高数据准确性:系统可以自动化管理和处理数据,减少了人工操作中的错误和遗漏,从而提高了数据的准确性和...

    Siebel 性能微调指南 (中文版)

    通过高速缓存节省 AOM 服务器资源 59 改进通讯配置的性能 59 配置会话通讯的日志 60 改进会话连接的可用性 61 改进屏幕弹出性能 61 改进 Siebel CTI Connect 的屏幕弹出性能 62 复审创建活动对性能造成的影响 62 ...

    项目8-局域网服务器的搭建.pptx

    查询本机的高速缓存 2.查询本机文件Hosts.txt 3.查询区域文件 4.查询高速缓存 5.查询其它NDS服务器 本 机 本地域名服务器 外部域名服务器 项目8-局域网服务器的搭建全文共42页,当前为第11页。 1.查询本机的高速缓存...

    FastCopy 3.2.1高速复制软件中文免费版.rar

    可以直接整合到系统资源管理器中,方便的让你利用右键菜单直接复制文件;内因三种不同的支持HDD工作模式,支持任务管理,支持命令行操作;内建多种人性化的操作模式,支持过滤,可以使用通配符; 特点:FastCopy是...

    易迅企业网站管理系统 v1.0.3.zip

    3、使用应用广泛的SMARTY模板引擎,页面高速缓存,提高网站运行速度,降低大访问量对服务器造成的压力; 4、采用MVC开发模式,搭配多套不同风格模板,使网站改版更加轻松; 5、PHP5完全的OOP设计思想,支持无限...

    易迅企业网站管理系统新年版 v1.0.1.rar

    3、使用应用广泛的SMARTY模板引擎,页面高速缓存,提高网站运行速度,降低大访问量对服务器造成的压力; 4、采用MVC开发模式,搭配多套不同风格模板,使网站改版更加轻松; 5、PHP5完全的OOP设计思想,支持无限...

    dapps:Dapps是一个跨平台的应用商店,包含众多软件

    AriaNg高速下载器:2倍迅雷速度,迅雷无法下载的资源,也能下载------人人影视:美剧爱好者的第一选择------kodexplorer可道云:像Windows操作一样的企业网盘------禅道:国产的开源项目管理软件------auxpi免费图床...

    入门学习Linux常用必会60个命令实例详解doc/txt

    本资源来自网络,如有纰漏还请告知,如觉得还不错,请留言告知后来人,谢谢!!!!! 入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如...

    下载工具多资源超线程技术,显著提升下载速度

    智能磁盘缓存技术,有效防止了高速下载时对硬盘的损伤 智能的信息提示系统,根据用户的操作提供相关的提示和操作建议 独有的错误诊断功能,帮助用户解决下载失败的问题 病毒防护功能,可以和杀毒软件配合保证下载...

    计算机网络常见问题解答

    安装到电脑上以后用WINDOWS的资源管理器发现在该磁盘的“属性”中只有74.5 G。是不是商店出了差错? 问题1-10:有这样的说法:习惯上,人们都将网络的“带宽”作为网络所能传送的“最高数据率”的同义语。这样的说法...

    Oracle_RAC安装配置指导书

    RAC 与 OPS 之间的一个较大区别是,RAC采用了Cache Fusion(高速缓存合并)技术。在 OPS 中,节点间的数据请求需要先将数据写入磁盘,然后发出请求的节点才可以读取该数据。使用Cache fusion时,RAC的各个节点的数据...

Global site tag (gtag.js) - Google Analytics