`

web策略类游戏开发(六)缓存概述

    博客分类:
  • Game
阅读更多

既然是概述,就没有太多详细的东西,本文主要针对asp.net开发环境。

webgame需要缓存的内容包括

1.游戏的配置信息

2.玩家的信息

 

对于游戏配置信息,通常是指游戏里一些固定不变的信息,例如建筑物每次升级时需要多少资源,需要多少时间等数据,这些数据当然可以写死在代码里,但通常这些数据应该放在代码外,要么是以文件形式存放(xml或者txt),要么就是放在数据库里。这部分数据的缓存很好做,只需要在应用开始时,统一做一次加载就可以了。一般来说,做过1年开发的同学都知道这种数据应该用单例模式来加载和使用,这点对java同样适用。当然做成静态属性也是可以的,只要把握好加载的时机就可以了。这里还顺便说一下,如果游戏的配置信息存在交叉访问(索引),则要注意两者之间的加载顺序。或者对交叉访问的部分不做索引,每次都动态的访问(查询)。

 

对于玩家的信息,则有一些说头了。基本上,现在的.net项目都做成3成结构+ORM访问。缓存的对象应该是游戏的实体对象。同上实体对象和数据库表之间都是一一对应的,这点没什么好多说的。以玩家或者村庄对象为了,它们的索引通常是ID,只需要创建对应的Dictionary<int, Player> 字典对象用来存取数据就可以了。

 

Dictionary<int, Player> playerMap = new Dictionary<int, Player>();
public Player Getplayer(int ID)
{
Player ret;
if (playerMap.TryGetValue(ID, out ret))
return ret;

ret
= 从数据库里获取玩家对象(ID);

playerMap.Add(ID, ret);

return ret;
}

 

上面是一个基本的用于从缓存里访问玩家对象的方法。这点对大家来说,都不算很难,有点经验的同学都能写得出来。

下一步如何更新这个缓存就是这个缓存系统才是webgame的麻烦地方。

我们缓存的对象和web应用的对象不一样,它存在着随时变化的可能,并且当他发生变化时,需要能及时反馈给用户。

web应用我们以blog为例,当某位用户添加了新文章到cnblogs的首页,可能不会立即被其他用户看到,因为cnblogs首页的缓存信息还没有被修改。通常根据需要这些缓存信息可能会是1分钟,也有可能是10分钟,只有当缓存过期了以后,系统才会生成新的首页内容。其目的是减少首页的数据库查询访问量。

webgame游戏则不太一样,我花资源升级,就希望在页面上能立即看到变化,因此,当我们完成某项业务逻辑操作后,需要人工的更新资源对象的缓存。

 

try
{
// 游戏逻辑处理
// 数据库数据提交

缓存更新();
}
catch (Exception ex)
{

// 日志处理
}

按照通常的做法,每次逻辑操作都包含在一个事务里面,如果逻辑操作失败时,则可以对事务做撤销处理,尽量避免数据异常。

当然,这个也不是绝对的,前两天在QQ上谈论到缓存更新的问题时,某位同学帖出了他的代码,代码里,缓存的更是是在数据库事务提交之前。如果提交发生失败,则整个游戏系统已缓存的数据为主。这个问题咋一看来,和我们的思路不一样,我们就认为这样做有问题,后来回家的路上仔细的想了想,其实这样做也不无道理,因为它是在数据库提交之前更新缓存,也就是说,如果发生错误,唯一可能错误的地方就是写数据库时写失败了。但如果整个游戏系统是以缓存数据为准,只要游戏逻辑在计算时没发生错误,将错误的数据写入缓存,那么就算当前的数据修改提交到数据库失败了,数据还有可能在下一次修改时,提交一份正确的数据到数据库。整个系统不会因为数据库瘫痪了而无法运行。这点感觉和网游的服务器设计思路近似,毕竟对于网游来说,不可能每次玩家的操作都将数据写回数据库,玩家的数据都以在服务器内存里的数据为准,以定时的方式将内存数据会写到数据库。

其实这两种设计思路的差别就在于,数据是以数据库为中心还是以内存数据为中心。对与web系统来说,自然是以数据库为中心。从网游的角度来说,自然以内存数据为中心。而webgame是这两大系统的结合,其数据访问思路自然综合了这两种观点,具体到某个游戏,则需要根据游戏的需要而加以取舍了。

 

除了以字典为主的缓存设计外,还有一个重要的缓存对象的设计需要说一下,那就是地图。目前常见的Webgame(Travian,武林三国)都是以一张400*400的世界地图为玩家的交战地图。通常是一次性全部加载到内存里。存放的格式,自然是以x,y轴坐标为依据的二维表里。虽然首次加载是数据会比较慢一些,内存占用的空间会多一些,但当玩家查看地图页时,你会发现页面生成的数据比从数据库里获取相应数据要快很多。再加上现在服务器内存动则4G,8G的。则几十兆的地图数据还是毛毛雨了。

 

 

 

作者:Yahle
原载:http://www.cnblogs.com/yahle
版权所有。转载时必须以链接形式注明作者和原始出处。
分享到:
评论

相关推荐

    Web缓存技术概述.pdf

    六、Web缓存的研究与发展趋势 Web缓存技术不断进步,研究者们通过不断优化算法和架构,提高缓存命中率。此外,移动互联网的兴起以及物联网技术的发展,也对Web缓存技术提出了新的挑战和要求。 总结来看,Web缓存...

    概述ASP.NET缓存机制

    ASP.NET 缓存机制是.NET框架下开发Web应用程序的重要特性,旨在提高系统性能,特别是对于数据库驱动的Web应用,缓存能够显著减少数据库查询和处理时间。缓存机制借鉴了硬件中的高速缓冲存储器(Cache)概念,通过将...

    asp2_0缓存概述

    【ASP.NET 缓存概述】 ASP.NET 缓存机制是微软.NET Framework 提供的一种优化Web应用程序性能的关键技术。它允许开发者存储数据在服务器内存中,以便后续请求可以快速获取,而无需重新计算或从数据库中检索。这显著...

    大华视频监控WEB二次开发插件demo.zip

    3. 性能优化:合理利用缓存策略,减少网络传输,提升视频加载速度。 4. 用户交互:设计良好的用户界面和交互体验,使用户能够方便地操作视频监控功能。 总结,大华视频监控WEB二次开发插件为开发者提供了一套完整...

    Web前端开发技术及其优化策略.pdf

    Web前端开发技术及其优化策略 Web前端开发技术是指使用HTML、CSS、JavaScript等语言开发的网页前端技术,包括网页的结构、样式、行为三个方面。随着信息技术的飞速发展,Web前端开发技术也在逐步走向成熟。然而,...

    Web开发技术(C#篇)

    掌握如何使用Visual Studio进行调试技巧,以及性能优化方法,如减少数据库查询、优化代码逻辑和利用缓存策略,能提升Web应用的效率和用户体验。 通过“Web开发技术(NET).doc”文档,初学者和学生可以深入学习这些...

    缓存技术详解

    #### 五、操作系统缓存概述 操作系统缓存主要用于提高文件系统的访问效率,常见的有: 1. **Windows Disk Cache**:Windows操作系统内置的文件系统缓存机制。 2. **Linux Disk Cache**:Linux内核提供的缓存机制,...

    概述ASP.NET缓存机制示例

    ASP.NET缓存机制是.NET框架下用于提升Web应用程序性能的关键技术。它允许开发者将常用数据存储在内存中,避免每次请求时都从数据库或其他慢速资源中获取数据,从而显著提高响应速度。在这个示例中,我们将深入探讨...

    PHP和MySQL Web开发第4版pdf以及源码

    《php和mysql web开发(原书第4版)》:开发人员专业技术丛书。 目录 读者反馈 译者序 前言 作者简介 第一篇 使用PHP 第1章 PHP快速入门教程 1.1 开始之前:了解PHP 1.2 创建一个示例应用:Bob汽车零部件商店 ...

    java web开发

    #### 一、Java Web 开发概述 - **定义**: Java Web 开发是指使用 Java 语言进行 Web 应用程序的开发。它利用了 Java 的跨平台特性以及丰富的类库资源,能够构建出高效、安全且可扩展性强的 Web 系统。 - **技术栈**...

    sliverlight__c#游戏开发系列

    在C#游戏开发中,首先需要掌握C#的基础语法,包括变量、数据类型、控制结构、函数、类和对象等。游戏编程的核心是逻辑控制和状态管理,因此理解面向对象编程的概念至关重要。C#的事件驱动模型特别适合游戏中的用户...

    JAVA WEB开发实战经典PPT

    **JAVA WEB开发实战经典PPT知识点概述** Java Web开发是基于Java技术的Web应用程序开发,它结合了Java语言的强大功能和Web的广泛可访问性。本资源“JAVA WEB开发实战经典PPT”提供了李兴华老师在MLDN的课程中的教学...

    浏览器HTTP缓存机制

    根据缓存策略的不同,HTTP缓存主要分为两大类:强制缓存和验证缓存。 ##### 强制缓存 强制缓存依赖于两个主要的HTTP头部信息来判断缓存是否仍然有效:`Expires` 和 `Cache-Control`。 - **Expires**: 指定资源到期...

    asp.net缓存技术

    内部缓存可以使用 `System.Web.Caching.Cache` 类来实现。 ##### 1. **添加缓存项** 添加缓存项的基本语法如下: ```csharp Cache["key"] = "value"; ``` ##### 2. **缓存依赖** 缓存依赖指的是当特定的文件或...

    Java Web开发详解2

    - **缓存策略**:利用Ehcache等缓存解决方案提高应用响应速度。 - **异步处理**:通过线程池等方式实现非阻塞操作。 通过以上内容可以看出,“Java Web开发详解2”可能会覆盖从基础到高级的各种Java Web开发知识点...

    Web前端开发技术实战视频教程 初级入门+高级实战++专家课程+面试指导

    #### 一、Web前端开发概述 - **定义与重要性**:Web前端开发是指通过HTML、CSS、JavaScript等技术实现网站或应用程序的用户界面部分,确保用户能够直观地操作并获取所需信息的过程。随着互联网技术的发展,用户体验...

    PHP和MySQL WEB开发(第4版)

    5.2.2 使用require()制作Web站点的模版 5.2.3 使用auto_prepend_file和auto_append_file 5.3 在PHP中使用函数 5.3.1 调用函数 5.3.2 调用未定义的函数 5.3.3 理解字母大小写和函数名称 5.4 理解为什么要定义自己的...

Global site tag (gtag.js) - Google Analytics