这段时间在处理服务端人物移动广播遇到了问题,记录一下。
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.总结
很多问题的解决是来自对问题的透彻理解。遇到问题,我们应该庆幸,又有折腾了。
分享到:
相关推荐
omen-1.1 自己基于netty开发的服务端,支持spring配置服务器启动模式:http,tcp,websocket等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用...
虎牙小游戏服务端_java.zip虎牙小游戏服务端_java.zip虎牙小游戏服务端_java.zip 虎牙小游戏服务端_java.zip虎牙小游戏服务端_java.zip虎牙小游戏服务端_java.zip 虎牙小游戏服务端_java.zip虎牙小游戏服务端_java....
棋牌游戏源码-升级版牛来了-含服务端-客户端
"网狐服务端---包含开发库---不过只有部分能用" 这个标题揭示了我们正在讨论的是一个针对网狐游戏平台的服务端程序,其中包含了用于开发的库资源。然而,重要的一点是,这些开发库并非全部可用,可能由于各种原因,...
HelloCpp 一个简单的完成端口(服务端-客户端)类.mht HelloCpp 一个简单的完成端口(服务端-客户端)类.mht HelloCpp 一个简单的完成端口(服务端-客户端)类.mht
网页版游戏服务端是构建在线游戏,特别是棋牌游戏的重要组成部分,它负责处理玩家的请求,管理游戏逻辑,并确保网络通信的稳定性和安全性。本服务端主要针对网页环境,意味着玩家可以通过浏览器进行游戏,无需下载...
Java 第三阶段增强分析需求,代码实现能力【多用户即时通信系统】(服务端)---- 代码 Java 第三阶段增强分析需求,代码实现能力【多用户即时通信系统】(服务端)---- 代码 Java 第三阶段增强分析需求,代码实现...
资源名称:svn-linux环境搭建服务端-windows环境下客户端使用 资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
通过minio客户端可连接minio服务器,配置路径的访问权限,不必登陆就能下载指定路径的静态资源
Windows-Mysql5.5服务端-只有31M,自用分享,识货拿走。 安装步骤:https://blog.csdn.net/lihua5419/article/details/73881482 以上为服务端。 客户端请查看个人资源--Sqlyog-mysql。
这篇实验报告涵盖了构建一个云笔记应用的全过程,主要涉及了Android客户端、服务端以及MySQL数据库的集成使用。这个项目是一个典型的移动应用开发实践,对于学习Java和Android开发的学生来说,具有很高的参考价值。 ...
在项目经验上,他们曾负责3D游戏《热血战地》的服务端逻辑设计和数据库设计,以及《奇侠》的2.5D网络游戏的二次开发,涉及游戏活动的开发、数据库维护、Web开发和玩家问题处理。此外,他们在Web开发和数据库管理方面...
此demo主要介绍的是完整的数据交互,从硬件-> unity -> webGL-> 服务端 -> 数据库之间的数据交互,解释了数字孪生的数据流。这是经过简化版的demo没有太多的功能,只有控制白天和黑夜,根据数据库的变化来动态的变化...
本文档是对svn服务端的安装,配置及使用的图文说明
omen-1.3 自己基于netty开发的服务端,支持spring配置服务器启动模式:http,tcp,websocket等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用...
单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-...
4. **安全验证**:防止作弊是服务端的重要职责,它需要检查和验证玩家的操作,如射击速度、移动速度等是否符合游戏规则。 其次,客户端是玩家直接交互的部分,它主要包括以下关键组件: 1. **图形渲染**:客户端...
在网络游戏环境中,服务端是游戏运行的核心部分,它负责处理玩家的所有交互数据,包括角色移动、技能释放、交易等。对于“外网一键安装即玩服务端”,这意味着玩家无需复杂的配置步骤,只需按照一定的教程就能在...
通过本次课程的学习,开发者可以更好地理解如何选择合适的开源工具和技术栈,以及如何优化服务端架构以满足不同规模的应用需求。 #### 二、App后端的重要性 - **技术竞争**:在App的竞争中,不仅前端应用和UI设计...
在游戏开发领域,服务端和客户端是两个至关重要的组成部分,特别是在构建一款网络游戏时。本项目提供的"游戏服务端+模拟游戏客户端"显然是一套用于测试和开发的游戏框架,其中涉及了C#编程语言以及游戏服务端和...