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

devtools/2024/11/15 0:42:50/

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

源码

  • 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.ppmy.cn/devtools/114292.html

相关文章

第一篇---滑动窗口最大值、前 K 个高频元素

第一篇---滑动窗口最大值、前 K 个高频元素 滑动窗口最大值*题目:思路:代码: 前 K 个高频元素*题目:思路:代码: 滑动窗口最大值* 题目链接:链接: 239. 滑动窗口最大值 题目: —给…

vue2基础系列教程之todo的实现及面试高频问题

关键知识点 v2里面,当在同一个元素或组件上同时使用v-for和v-if,v-for的权限高于v-if v-show和v-if的区别主要有 v-if是惰性的,v-show是及时的v-if值为false时,不会生成dom,v-show不管值是true或false,都会生成dom,修改的是dom的display属性…

『功能项目』调整Boss技能bug【51】

我们打开上一篇50切换职业技能面板的项目, 本章要做的事情是调整主角在进入boss01攻击范围内生成的boss技能特效在主角离开时有时会不消失的bug 修改脚本:BossOpt.cs 另外修应该一个冗余脚本:PlayerOpt.cs 运行项目 - 主角在进入boss01攻击范…

深入 mysql,掌握一对一、一对多、多对多表设计、查询及级联操作

数据库表的基本概念与关系 数据库通常包含多个表,每个表存储特定类型的信息。例如: 学生表:存储学生信息。老师表:存储老师信息。班级表:存储班级信息。 这些表通过各种关系连接,形成一个结构化的数据管…

服务器管理:从零开始的服务器安装与配置指南

在现代IT环境中,服务器的安装和配置是每个运维工程师必须掌握的基本技能。本文将详细介绍如何从零开始安装和配置一台服务器,确保内容通俗易懂,并配以代码示例和必要的图片说明。 一、准备工作 在开始安装服务器之前,需要准备以…

网络协议习题第一章

习题 根据IP地址的格式计算,最多有多少个A类、B类和C类网络号 A类网中,网络号占7个bit, 则允许指派的网络数为2^7128,但是要除去0和127的情况,所以能用的最大网络数是126(1~ 126)。B类网中,网络号占14个b…

《程序猿之设计模式实战 · 池化思想》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

【题解】CF2009G1

前言 只会做G1 ,但尽量做到最好,除了一开始的排序的O(nlogn),后续处理都是O(n)。可能会对G2和G3有一点点用处。 翻译 原题链接CF2009G1 思路 直接处理等差数列不方便,但这个等差数列性质特殊,即公差为1。所以在一个等差数列…