游戏缓存的小改进

来源:互联网 发布:讲文明知礼仪主题文章 编辑:程序博客网 时间: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条,不足一页,所以不缓存。下次翻页再次请求数据。服务器端不需要版本比较,直接发送数据。如果客户端收到的数据是满上一页的,则缓存,下次读取,直接读缓存。

  办法很简单,做法也很简单。将客户端数据按页缓存就是了。

 

  

  本文中有错误会可以更好的改进的地方,希望朋友们多多指教。一起学习一起进步。

原创粉丝点击