网页游戏服务端-人物移动广播优化

【本文转自网络http://janeky.iteye.com/blog/1614175

这段时间在处理服务端人物移动广播遇到了问题,记录一下。

1.问题

现在的页游都朝着客户端的方向靠齐了,大地图,千人同屏。因此,也给页游的服务端开发带来了不少的挑战。假设一个场景地图是8000*8000大小,同时有1000人在。1秒钟内,每个玩家移动一次。按照最原始的做法,就是给同一个场景的用户广播消息。简单计算一下广播量:1000*1000=1000000的广播量,有点恐怖。

2.方案

优化的目标肯定是减少广播量了。我们看到,场景特别大,这对于美术同事来说不是什么好事了,对于服务端来说,未尝是坏事。假设最理想的状态下,用户能够遍布各个角落。那么,我们只想向能看到移动目标的用户广播消息就行了。假设一个屏幕大小为1600*1000,一个屏幕理论上分布了8000*8000/(1600*1000)=25人。还是每秒每个人移动一次,总的广播消息量是:25*25*40 =
25000.哈哈,整整少了40倍的广播量,服务端压力少了,替老板省了不少钱,回去申请加点奖金吧。

3.实现

按照上面的思路,实现起来就非常简单了。以前是给场景的每个用户广播,现在只需增加一步筛选的过程,根据坐标选择视范围内能看到移动目标的玩家。方法比较简单,这里就不提供详细的代码实现了,还有不清楚的,可以留言讨论一下。

4.优化

做到上面的,基本上已经符合标准了。但是,作为搞技术的,追求完美是无止境的。我们又在想,还能不能进一步优化?好的优化总是在仔细分析问题的基础上产生的。我们相信分析一下广播的内容,加入a移动了,那么在同屏的b,c分别会受到一条广播,内容大致是(a,from,to).同理,b移动了,a,c也是受到这样类型的广播。c在同一个时间段收到了两条广播。这两条广播能否合并呢,变成(a,from,to;b,from,to).这就是优化的灵感了。对于实时性不高的回合制页游(非即使战斗arpg),玩家看到其他玩家的移动,并不要求一定实时。为此,我们可以考虑合并

消息。

实现起来非常简单,可以用一种类似生产者-消费者的模型来实现。每次前端发来的位移消息都放入队列。后端有个独立的线程,每隔一段时间,取出来数据,合并消息,广播给相关的用户。上述a,b位移后,c只收到一条消息了

5.总结

很多问题的解决是来自对问题的透彻理解。遇到问题,我们应该庆幸,又有折腾了。

网页游戏服务端-人物移动广播优化,布布扣,bubuko.com

时间: 2024-08-03 02:54:41

网页游戏服务端-人物移动广播优化的相关文章

红叶倾城一键网页游戏服务端+客户端(无须安装Java)源码

倾城的一键安装版服务端(包括客户端) , 无须安装Java,直接启动服务端就可进入游戏!!!新开服添加首个GM的方法:注册帐号并登陆游戏创建角色名称后,再服务端控制台中输入gmGrade 玩家角色名称 255即成功升级该角色为GM(注意输入的命令的大小写)//////////////////////////////////////////changeHeroLevel 玩家角色名称 级别/addPlayerTreasure 玩家角色名称 数量                /addGoods 物

游戏服务端架构 介绍

游戏服务端架构 介绍 端游.手游服务端常用的架构是什么样的? http://www.zhihu.com/question/29779732 根据知乎问答文章整理而成. 作者:韦易笑 谢邀,手游页游和端游的服务端本质上没区别,区别的是游戏类型. 类型1:卡牌.跑酷等弱交互服务端 卡牌跑酷类因为交互弱,玩家和玩家之间不需要实时面对面PK,打一下对方的离线数据,计算下排行榜,买卖下道具即可,所以实现往往使用简单的 HTTP服务器: 登录时可以使用非对称加密(RSA, DH),服务器根据客户端uid,当

游戏服务端定时器的实现

最近在看过一些定时器相关的资料,也读了一些代码,比如云风的skynet的定时器实现,小有启发,因此将所得整理记录下来. 通常,一个定时器模块会提供以下三个接口: reg_tick(timeout, callback); unreg_tick(tick_id); update_timer(); reg_tick注册一个tick,unreg_tick取消一个tick,update_timer更新计时器的时间,触发其中过期的tick.前两个接口好理解,问题是第三个接口update_timer,到底什么

为什么多数游戏服务端是用 C++ 来写

早年开发游戏必须用C++,这没得说,2000-2004年,java还没有nio,其他动态语言不抗重负,只能C/C++能开发出完整可用的游戏服务端.直到2005年,韩国的游戏很多都还是纯C++写服务端,金山之前也开发过很多纯粹C++的游戏服务端,后来大家都切了. 现代选择有很多:java + javascript, c+python, c+lua, scala, go, erlang.我们面向性能的服务器用 java,面向逻辑服务器 python,面向高并发的会选择 scala,次一级高并发或者性

非常强的一款开源的分布式游戏服务端引擎(kbengine)

一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端. 服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术,将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏. (经常被问到承载上限,kbengine底层架构被设计为多进程分布式动态负载均衡方案,理论上只需要不断扩展硬

游戏服务端pomelo完整安装配置过程

游戏服务端pomelo安装配置 一.安装环境 debian 7.0 amd64 二.安装需要的组件 1.安装nodejs 注:debian下nodejs没有相应的apt包,所以无法用apt-get安装,只能通过nodejs的源码包安装, 这里有比较全的其他系统环境下安装nodejs的方式https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager a.安装所需的组件,python g++ #apt-get i

游戏服务端pomelo安装配置

一.安装环境 Linux Ubantu 二.安装需要的组件 1.安装nodejs 注:debian下nodejs没有相应的apt包,所以无法用apt-get安装,只能通过nodejs的源码包安装, 这里有比较全的其他系统环境下安装nodejs的方式https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager a.安装所需的组件,python g++ #apt-get install python g++ ma

开源分布式游戏服务端引擎kbengine

服务端引擎: http://www.kbengine.org 什么是KBEngine? 一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端. 服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术, 将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏. (经常被问到承

游戏服务端中使用Servlet和Java注解的一个好设计

SNS类游戏基本都是使用HTTP短连接,用Java来开发服务端时可以使用Servlet+Tomcat很轻松的架构起服务端来.在这里介绍一种使用Servlet比较好的一种设计,我也见过很多基于HTTP请求的游戏服务端使用Struts.Spring.Hibernate等等,其实我感觉对于游戏来说使用这些东西很繁琐,若是开发Java Web应用使用SSH倒是合情合理. 使用Servlet时,我们可以只创建一个Servlet左游戏中所有请求的入口,然后使用注解来标识方法,在程序启动时使用反射去收集注解的