游戏缓存的小改进
来源:互联网 发布:讲文明知礼仪主题文章 编辑:程序博客网 时间:2024/05/16 10:56
一款大型网络(网页)游戏。我认为主要有两个方面影响游戏的性能。
1,数据库读取,影响游戏逻辑模块代码的执行时间。在多并发下,影响到了游戏整体性能
要缩小这个影响。可以事先将数据库中的数据读到内存里。游戏运营期间,读取的是内存的数据。这样,就在一定程度上绕过了数据瓶颈。通常,都是将商城等这样的数据预告读入内存。因为商城里的出售的商品数据,一般是比较固定不变的。维护起来方便。
这个方案可以再度改善。可以将玩家数据也读入内存。
至于,在游戏启动其间是否加载所有玩家数据进入内存,或是按照分布方式,老化机制读取维护。这一方面我还没有花时间去思考学习。如果有在这方面有高见的朋友,望不吝赐教。鉴于物理内存条市场价格不是很昂贵,这种以内存空间换取程序性能的方式是可取的。
2,网络通信,毕竟是一个IO操作,也是会影响游戏性能的一大关键因素。
在在谈到关于构架一款高性能游戏时,我们同事间偶尔会谈论关于将聊天模块独立于另一台服务器的方案。如此,在类似于这样高频数据通信。对服务器性能比较底层将是一款比较大的考验。通常各位大牛会考虑用C++,而放弃java编写服务端代码。因为C++相对于底层,在这方面比java性能好。
但是,不管用什么语言去编写服务端代码。通信的优化是我们总是要考虑的。
从第一天开始写游戏代码,我就开始思考前台客户端数据缓存的架构。并把想法实现到了代码里。既在通信方面的优化是,能不通信的,尽量的不通信。能小量数据传送的,尽可能的用小量数据传递。
这方面,可以在游戏通信协议上优化,就是上面提到的“能小量数据传送的,尽可能的用小量数据传递”,这是架构的另一大方面。今天暂不和大家讨论这一点。
还有一点可以做到优化。既以上所提到的“数据缓存的架构。并把想法实现到了代码里。既在通信方面的优化是,能不通信的,尽量的不通信”。一般是用在客户端做缓存做到这一点。
今天我想和朋友们分享关于客户端缓存与服务器数据同步的一个小小方案。
如果我们将客户端接收到数据都缓存起来。比如A玩家查看所有玩家列表,当看到第14页有3条数据(假设1页有10条)。如果将这页的内容缓存在了客户端。过会,又有新玩家B注册进游戏了。由于A中已经缓存了14页内存,后来加上B玩家,虽然也在14页,但A不刷新则是看不到了。如果用A注册,广播所有玩家更新缓存。这种做法不明智。毕竟不是邮件数据这种性质。对于此类数据。客户端的缓存,有两个解决方法。
第一,客户端需要再次翻页到13页,会向服务器申请,并提交当前数据页的版本号,服务器根据比较版本号,决定给不给客户端发送数据。但服务器对于版本号的比较,是一个比较烦琐的事。今后有时间再来考虑这个方案。
第二,还有一种办法比较简单,就是我接下来一段时间会采用的。
客户端按页进行缓存,假如刚才的A玩家读取了14页的数据,由于只有3条,不足一页,所以不缓存。下次翻页再次请求数据。服务器端不需要版本比较,直接发送数据。如果客户端收到的数据是满上一页的,则缓存,下次读取,直接读缓存。
办法很简单,做法也很简单。将客户端数据按页缓存就是了。
本文中有错误会可以更好的改进的地方,希望朋友们多多指教。一起学习一起进步。
- 游戏缓存的小改进
- 改进的java小程序
- NTGraph控件的小改进
- 二分查找的小改进
- Notepad++ HexEditor的小改进
- NET2.0中改进的缓存功能
- 改进Smarty的缓存过期检测
- 推箱子II游戏代码的改进
- 动作类游戏的改进想法
- 一个猜数字游戏代码的改进
- Java数独游戏的改进
- 魔鬼牧师游戏--简单工厂的改进
- SAP ABAP编辑器的小改进
- LUA string.format的小改进
- RBAC权限管理的一点小改进
- 最简单的判断素数小改进
- ES6这些令人激动的小改进
- 改进市售的蓝牙小音箱
- 阿里巴巴,你诚信吗?!
- poj 3463 Sightseeing
- 高效程序员的45个习惯总结...
- Linux定时执行任务命令概述:at和crontab
- java非递归二分查找
- 游戏缓存的小改进
- 我的收几;
- 使用LoopcRDP在家远程控制公司内网电脑(远程桌面)
- POJ3349 Snowflake Snow Snowflakes 自己写个哈希模板
- SQL注入原理深度解析
- 什么是 WPS(Wi-Fi Protected Setup)
- C#数据库事务原理
- hdu1171_多重背包转化为01背包
- Learning OpenGL : (5) Using OpenGL