当前位置: 首页 > article >正文

架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间

本文首发在这里
重中之重就是想实现无锁!无锁!无锁!

源码

  • server
  • golang

预计还会实现gate_server,接受并保持websocket长连接,按需双向流到game_server进行消息转发

未来上述服务均会以容器的形式由k8s自动化部署、扩展、管理

实现简单示例:自创的骰子游戏

服务端

cd ~/go/src/github.com/panshiqu/server/game_server
go run main.go

客户端

cd ~/go/src/github.com/panshiqu/server/game_server/game/dice/client
go run main.go -u=1 -r=1 -seat=-1 -name=dice -auto=false -print=false
# 输入 shake 或 print

# go run main.go -print
# 以上展示两种安全打印内存的方式

请查看主要对象的接口,若是能从命名、注释、查看引用就能很快理解的,下面大概率是不赘述的

游戏主要接口调用时机

  • Init(IRoom) error房间创建初始化时,调用失败会导致房间创建失败
  • Reconnect(IUser)连接即坐下,用户已在此房间有座
  • SitDown(IUser)连接即坐下,用户首次进入此房间
  • StandUp(IUser, int) bool断开即站起或其它譬如游戏结算后站起离线用户
  • OnDisband(int64)停服解散所有房间或其它譬如游戏结算后房间因无人而解散

框架开放的个别接口(赋予游戏的能力)

  • room.Disband()直接对房间发起解散

  • user.Disband()借用户发起解散其所在房间

  • user.Disconnect(int)主动断开客户端连接

  • user.StandUp(int)站起用户

  • user.SetData(any)为用户设置任意数据

  • room.Send[Pb]支持排除部分用户

核心设计

  • 连接即坐下,断开即站起
  • 游戏可以拒绝站起,将视为离线,框架负责识别重连
  • 全局错误码,pb.ErrorResponse即错误,返回错误即回复,开发环境错误回复填充调用路径
  • 框架为适应各类游戏仅负责必要逻辑,基本不校验游戏的调用,不集成用户准备、房间游戏状态等逻辑
  • 好用的定时器模块,支持添加重复定时、定时器支持重置、停止、获取剩余时间,并发亦可安全

简单说明

  • 指定数量config.Seat座位以外是旁观席且会自动扩容
  • 游戏在用户落座后检测到不符合准入条件可调用旁观接口(待实现)将用户移到旁观席
  • 框架因房间已满用户落座旁观席,待有座时游戏可调用换座接口(待实现)将用户移到可游戏座位
  • 用户在A房间却想进B房间,创建却无人进的B房间当前是懒解散,建议游戏实现逻辑解散不活跃的房间
  • gate_server收到game_serverpb.Cmd_Disconnect会调用stream.CloseSend来允许GracefulStop

关于匹配(待实现)

  • 当前进入游戏必须携带房间编号,未来会实现match_server微调雪花算法来生成房间编号
  • 基于规则优先返回已有的房间(金币场),实现打立出局、定局积分等赛制(比赛场)
  • 考虑扩展game_server支持未携带房间编号的单服匹配(小微游戏)
  • 敬请期待实现后再来阐述更多细节

写在最后

  • 写代码的时候,太多想写进博客,确实也有备忘,最后复看代码,还是不要啰哩啰嗦啦
  • 基于此刻源码成文,代码大概率会继续完善,也会尽量同步更新此文,但话不绝对

关于游戏不停服更新的补充:文字说明请看这里,代码修改请看这里


http://www.kler.cn/news/305657.html

相关文章:

  • Oracle发送邮件功能:配置自动化发信指南?
  • Redis搭建集成
  • 【ACM独立出版】第二届物联网与云计算技术国际学术会议 (IoTCCT 2024,9月27-29)
  • BookStack在线文档管理系统本地Docker部署与远程访问详细教程
  • 安全运维工程师学习路线
  • Unity实现自己的协程系统
  • RFB_modified模块的作用?和ASPP模块的区别?
  • GLSL 棋盘shader
  • STM32 HAL freertos零基础(六)计数型信号量
  • 十二,Spring Boot 异常处理(自定义异常页面,全局异常,自定义异常)
  • 视频融合共享平台LntonAIServer视频分析平台噪声监测优势
  • 【计算机网络 - 基础问题】每日 3 题(五)
  • 【数据结构】8——图3,十字链表,邻接多重表
  • Android Activity组件与进程启动间关系
  • 电子电气架构——中央计算的软件定义汽车架构
  • 流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?
  • 如何用SQL Server和Oracle进行数据同步?
  • 人工智能与机器学习原理精解【19】
  • 幂等性小记
  • C# SQL 辅助工具
  • 321. 拼接最大数
  • 【RabbitMQ 项目】服务端:数据管理模块之绑定管理
  • PostgreSQL 与 MySQL:如何为你的项目选择合适的数据库?
  • 闲鱼 sign 阿里228滑块 分析
  • Spring事务传播行为详解
  • 【JavaScript】LeetCode:36-40
  • 使用Python实现深度学习模型:智能饮食建议与营养分析
  • OSS对象资源管理
  • React函数组件传参
  • 大数据-127 - Flink State 04篇 状态原理和原理剖析:状态存储 Part2