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

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

源码

预计还会实现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支持未携带房间编号的单服匹配(小微游戏)
  • 敬请期待实现后再来阐述更多细节

写在最后

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值