来源: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有额外时间的时候可以把未来可能用到的资源载入到资源高速缓存。
最后,尽管在游戏的资源管理中资源打包不是必须的,但仍然建议大家把资源文件按类型分别打包到单一的文件中,这将为你节省磁盘空间,并加快游戏的载入速度。
分享到:
相关推荐
在网络游戏中,高速缓存可以被用来存储游戏资源,如地图、角色模型、音频文件等,这样当玩家需要这些资源时,就可以从高速缓存中直接获取,而不是每次都要通过网络重新下载,从而显著提升了游戏运行速度。...
在网络游戏中,高速缓存可以预加载游戏资源,减少玩家等待时间,提高游戏流畅度。 在无线局域网环境中,高速缓存的应用主要体现在以下几个方面: 1. **资源预加载**:游戏中的地图、角色模型、特效等大量静态资源...
在网络游戏中,高速缓存可以用来存储游戏资源,如地图、角色模型、音效等,以便快速加载,降低延迟。 2. 自适应连接:自适应连接是指网络系统能够根据当前网络环境的变化自动调整其连接参数,如带宽、编码速率等,...
【磁盘高速缓存程序】 磁盘高速缓存程序,如标题所示,是一种技术,用于提升计算机系统在处理数据时的效率,特别是涉及到磁盘I/O(输入/输出)操作时。这种技术通过预读取和存储频繁访问的数据到内存中,避免了反复...
在实际使用中,高速缓存管理器会根据文件访问模式、系统资源使用情况以及当前系统负载等因素,动态调整高速缓存的大小和策略,以达到最佳的性能平衡。例如,在资源充足时可能会增大缓存大小,而在资源紧张时则缩小...
### 高速缓存知识详解 #### 基本概念 **高速缓存**(Cache)是一种特殊类型的存储器子系统,它通过复制频繁使用的数据来实现快速访问的目的。Cache通常采用比主内存(RAM)更快但成本更高的静态随机存取存储器...
在大规模在线游戏中,玩家频繁交换、查看游戏内的图片资源,如角色、装备、地图等,高速缓存可以显著减少图片加载时间,提高用户体验。同时,它还有助于减轻服务器压力,防止因大量并发请求导致的网络拥塞。 总结来...
读缓存能减少等待时间,因为从高速缓存读取数据比从磁盘直接读取更快;而写缓存则可以暂时保存待写入的数据,等到系统空闲时再一次性写入,避免频繁的磁盘写入操作影响性能。 当服务器磁盘读取出现缓慢的情况,可能...
资源受限设备的信息高速缓存技术,主要是针对移动设备或低配电脑等资源有限的平台。在这些设备上,内存和处理器性能通常是瓶颈,因此高效地管理内存和计算资源至关重要。缓存策略可以包括预加载、LRU(最近最少使用...
在现代图像处理技术飞速发展的背景下,对于高速、实时嵌入式数字信号处理系统而言,高分辨率和高帧频图像数据的高速缓存能力已经成为系统性能提升的关键。由于静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM...
通过利用存储器阵列作为最后级高速缓存片和神经网络单元存储器,我们可以提高数据处理速度,优化资源管理,以应对日益复杂的游戏环境。未来,随着技术的不断发展,我们期待看到更多高效、智能的处理器解决方案涌现,...
缓存是一种高速存储器,其主要目的是加快数据的访问速度,减少对后端存储系统的请求。根据不同的应用场景,缓存可以分为以下几类: 1. **应用级缓存**:这类缓存通常由应用程序直接管理,用于存储频繁访问的数据,...
在CMT架构中,高速缓存的管理与优化对于充分发挥多线程的优势至关重要。 一、高速缓存层次结构 CMT处理器通常具有多级高速缓存体系,包括L1、L2、甚至L3缓存。L1缓存最小但最快,通常每个线程执行单元都有独立的L1...
数据高速缓存区命中率是衡量数据库性能的关键指标之一,特别是在高并发的环境中,缓存的效率直接影响到系统的响应速度和资源利用率。本文档将深入探讨数据高速缓存区(Buffer Cache)的管理与优化策略,以提升其命中...
配置 servlet 高速缓存以将 servlet 的输出和 JavaServer Pages(JSP)文件保存到动态高速缓存中。 在您开始之前 要启用 servlet 高速缓存,您必须完成 启用动态高速缓存服务 。 关于本任务 每次 servlet 运行时...
高速缓存分为多级(如L1、L2、L3),每一级的容量和速度都有所不同,但都是为了在有限的资源下尽可能提升性能。 自适应高速缓存清除(Adaptive Cache Flushing)是指根据系统的运行状态和需求,动态调整缓存清理...
《网络游戏在CDMA2000无线IP网络中优化资源管理的方法和装置》 这篇文档主要探讨了如何在CDMA2000无线IP网络环境下,有效地管理和优化网络游戏的资源,以提供更好的用户体验。CDMA2000,即码分多址2000,是一种第三...
《网络游戏-无线广播通信融合网络资源管理系统及方法》是一份深度探讨现代网络游戏在无线通信领域中的创新应用的资料。这份资料主要围绕着如何利用无线广播通信技术,构建一个高效、智能的网络资源管理系统,旨在...