棋牌游戏定时器模块设计
棋牌游戏定时器模块设计
最近在研究棋牌游戏,想在今年上半年出一款本地麻将。github上down了几个麻将的模块走读了下,基本上可以做麻将的AI,算听,记番功能,用JNA调用了下,很nice。
算法搞定以后就是后台了,之前也接触过几个开源的游戏后台,这些开源后台其实就是搭个架子,里面的模块都没有,还需要自己垒。
我列了下棋牌后台的两个最重要的模块:
1.定时服务器
棋牌游戏里有太多的定时任务了,特别是出牌倒计时,有1000个桌子就要有1000个定时任务并发。
2.网络连接管理
上线了,掉线了,离线了,换终端了,需要重连,这些都需要专门的模块管理
当然还有数据库、异步调度、消息队列、线程池、序列化等等这些基础模块
今天只说定时器模块
现在一台服务器并发个几万桌游戏都很正常,定时任务的并发至少在几万以上。 我们广电少点吧,好歹也要准备个几千个并发能力。
很明显单纯的多线程肯定是不行的。
搜了下,都不合适,总觉得不够优化,那只能自己设计了
特点分析
1.并发高(这是肯定要concurrent并行容器了)
2.任务执行有先后次序(有点像队列)
3.只执行现在时刻的到期任务(貌似读区间和写区间是分开的,不用锁了?)
4.我理想的定时器要能记录任何时间点的任务
解析
开始想用hashmap,但是在读的时候,需要对任务执行时刻排序,为什么不能在写任务的时候就排好呢?数据结构肯定是队列无疑。
程序应该是这样的,a一条任务队列,很多游戏线程会往队列里按时间顺序插入任务。b定时服务主线程1ms轮询一次队列中第一个任务,如果到期,取出执行。
用什么数据结构呢ConcurrentSkipList ,插入拥有O(logN)复杂度,删除复杂度是O(1)可以说相当快了。
优化
1.时间轴分段?棋牌大多数倒计时都是在当前时刻15秒时(看你的游戏规则),插入时间点过于集中。
2.10条或者100条list做负载均衡? 复杂度-1和-2 。但是主线程轮询的时候需要对10个或100个数据进行排序,反而更差。
3.既然棋牌大多数都是1分钟以内的定时,我在1分钟以内的定时用轮盘实现,数量为6000,每个时间片是10ms。每个时间片使用ConcurrentHashMap实现并行插入,插入复杂度是O(1),读取复杂度也是O(1)。 当然一分钟以外的定时任务,我们可以用ConcurrentSkipList记录,并额外需要一个线程,不断把SkipList中的定时任务转移到1分钟轮盘中。
虽然多了一个线程,但是无论是空间还是时间都是非常优化的。nice!!
4.“特点3”读区间和写区间是分开的,ConcurrentSkipList第一个元素的读取复杂度是O(1)
5.(2019/02/19)优化“3”,需要多一条线程,细想还是不对,第一条线程在读取时间轮盘以后,再读取一下 ConcurrentSkipList的任务就好了,没必要两个线程。真实优化无止境啊 ,fuck!!!
总结
1 一分钟以内的定时,用6000个ConcurrentHashMap组成一个时间轮盘,每个ConcurrentHashMap存储10ms时间段的定时任务。
2 一分钟之外的定时,用ConcurrentSkipList统一存储。
3 thread1 定时轮询当前时间片的ConcurrentHashMap,并发送具体任务给对应的worker执行。然后再读取ConcurrentSkipList,并发送具体任务给对应的worker执行。
4 thread1 千万不要阻塞。
棋牌游戏定时器模块设计相关推荐
- 手机棋牌游戏开发的流程是怎样的?
最近几年,随着网络游戏的兴起,棋牌手游开发也越来越受欢迎,在国内,几乎随处可见从事手游和手游的公司.不过,虽然公司和产品很多,但效果也不一样,区别就在于,他们能不能掌握好这款游戏的关键.那么,在手机上 ...
- 棋牌游戏开发UI设计师如何打造受玩家欢迎的界面
棋牌游戏由于其简单的玩法规则,深受群众喜欢,但这只是棋牌游戏开发侧重的一方面,如果玩家连最开始的下载试玩欲望都没有,又如何了解你的游戏规则呢,因此棋牌游戏开发界面设计,也是影响其是否能够受大众认可的重 ...
- 棋牌游戏服务器架构: 详细设计(二) 应用层设计
这里的应用层,指的是CenterServer.LogonServer.LogServer.RoomServer等几个服务器,另外还包括游戏模块的设计.不过游戏模块和前4个服务器的设计很不相同.这里先说 ...
- 棋牌游戏服务端开发和设计-苏劲-专题视频课程
棋牌游戏服务端开发和设计-279人已学习 课程介绍 本门课程讲解棋牌游戏服务端的架构.数据库的设计.数据库异步存储.帐号管理.房间管理等棋牌游戏服务端的核心技术,有意向从事棋牌研发的同 ...
- HTML5期末大作业:棋牌游戏网站设计——棋牌游戏(8页) HTML+CSS+JavaScript web大作业 静态网页
HTML5期末大作业:棋牌游戏网站设计--棋牌游戏(8页) HTML+CSS+JavaScript web大作业 静态网页 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物 ...
- 基于滴滴云的棋牌游戏服务端架构设计
现在小团队开发的棋牌游戏有很多,棋牌行业的相互攻击是非常普遍的现象,同行之间往往会采取 DDOS.CC 等攻击的手段来打击对手,这是目前棋牌运营商们面临的比较严峻的一个问题,那么在设计棋牌游戏服务端架 ...
- 游戏微服务架构设计:棋牌游戏
棋牌游戏怎么做分布式? Gate 这个连接用来做负载均衡,只是为了获取连接服的连接地址用,客户端连接后,拿到连接服的IP和端口就断开.其中,如何选择连接服的策略可以是随机.轮询.加权重等. Conne ...
- 【棋牌游戏】JAVA服务器设计与开发(一)
####开篇语 大概在16年时候,新型房卡模式打开棋牌游戏新里程,整个棋牌行业迅速改变模式,出现近两三年激烈的竞争景象,据统计全国大大小小棋牌游戏公司,专职棋牌公司近两万多家,这都不算后起大大小小游戏 ...
- 棋牌游戏服务器架构: 总体设计
首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构.网狐棋牌最令人印象深刻的是其稳定性和高网络负载.它的一份压力测试报告上指出:一台双核r的INTEL Xeon 2.8CPU加上2G内存和 ...
- 网狐棋牌游戏平台服务器架构设计分析
调用模型 模仿COM组件接口模式,利用面向对象思想多态性polymorphism,调用方保存着被调用方的基础接口指针(interface or sink钩子)(Pure Virtual Functio ...
最新文章
- 【技术综述】一文道尽R-CNN系列目标检测
- android系统中sd卡各文件夹功能详解 guessword,AndroidStudio LiveTemplate函数说明
- Struts2中OGNL,valueStack,stackContext的学习
- Controls 属性与继承 TShape 类的小练习
- Android魔法(第二弹)——一步步实现淹没、展开效果
- Android开发之ApiCloud模块开发的注意事项
- 计算机丢失wpcap.dll会影响什么,Win7系统提示wpcap.dll丢失如何解决?
- 读书笔记——数据库系统概论
- Microsoft.NET Pet Shop 4.0各个模块之间的联系
- Sql2Bean代码生成器
- 魔兽世界 助手 无法连接服务器,魔兽世界助手8.1无法登陆
- 《数字信号处理》系统函数的频率响应、零极点和稳定性的实现
- Cesium开发基础获——取鼠标点击的经纬度(lon、lat)、高度(height)、相机的视角(heading、pitch、roll)
- 基于python的opencv计算机视觉基础知识及例程代码【视觉入门看这一篇就够了】
- 动态规划:HDU1248-钱币兑换问题
- 共享经济思考:标准化与个性化如何融合
- moment.js 计算当前一周、一月对应日期
- 前端学习-品优购实践
- 原神抽卡模拟器(java简易版)
- 清朝盛衰的六个时间点!