求一个 golang 下基于房间的小游戏设计思路

2019-02-22 14:30:06 +08:00
 waibunleung

前提,之前没有相关游戏开发经验,go 也是现学,准备练手。

准备开发一款小程序,类似于 5~10 个人在一个房间里面进行游戏,需要实时数据广播,统计等。

假设所有用户都在一个同一个房间里面的话还挺好处理,但是如果要分房间的话,不是没有思路,而是不知道有没有更好的。

目前想到的是 一个房间用一个 goroutine 来处理,里面维持 5~10 个用户 socket,goroutine 用协程池来管理

可能问题有点幼稚,但是想得到各位指导与启发

4774 次点击
所在节点    程序员
30 条回复
waibunleung
2019-02-22 16:55:55 +08:00
@mosliu 你这个想法好像跟我问题里面提出的差不多,谢谢你的回复~我去试一下
waibunleung
2019-02-22 17:23:31 +08:00
@tcfenix 另外,不需要关心 ws 过多以及 MQTT 相关的问题吗?
pubby
2019-02-22 17:40:55 +08:00
做过一些类似的

有些是房间无关的:
1. 比如 websocket 建立后,首先需要用户认证,让服务端识别这个连接对应的用户。认证可以用类似 access_token 的方式,客户端建立连接后第一个消息发送 access_token,让服务端识别用户,并绑定连接和用户 ID 之间的关系。
2. 移动端掉线、网络切换、进入后台连接断开都比较频繁,需要定时往返一些心跳消息让服务端知道用户是否还在线。
3. 游戏的话可能涉及到时间同步,可以在心跳消息中带上用于计算客户端和服务端时间误差的一些信息。

房间相关的:
其实很简单,客户和服务端发送房间相关的消息都带上房间 id 就行了。
服务端每个房间开一个 goroutine,维护房间里的用户列表,处理房间相关的消息
服务端根据消息中的房间 id,把消息写入房间 goroutine 对应的消息 channel 就行了。


思路其实很简单,就是细节还很多,做了才知道。


长连接是比较耗资源的,如果游戏火爆,长连接服务做分布式接入比 http 麻烦很多,就不多说了。

另外记得用 github.com/gorilla/websocket 这个包,不要用 go 标准库里的那个残废。
jeremaihloo
2019-02-22 19:42:13 +08:00
github mqant 项目,官方有例子,原生支持 mqtt
vlyonline
2019-02-22 20:01:08 +08:00
哈哈,我也在搞这个,不过我在搞麻将,有点头大,我准备用结构体 room 里面放个数组,数组里面放房间里面的人~~~~~~广播很简单的,你去实现一个聊天室,然后基于这个聊天室做分房间功能就可以了,只是结构体和数据放一起有点恶心
tairan2006
2019-02-22 20:32:38 +08:00
楼主可以看一下 leaf 这个项目,每个房间一个协程没问题的
waibunleung
2019-02-23 14:46:15 +08:00
@pubby 真的十分感谢你的提点
waibunleung
2019-02-23 15:19:17 +08:00
@jeremaihloo 你好我想问一下为什么多数都推荐游戏服务器走 mqtt 协议?它是一个物联网协议,在游戏领域应用有什么意义或者优势吗?
SmallSir
2019-03-21 16:14:03 +08:00
@xkeyideal 我想知道如何实现组内广播,跨组广播这种呢
xkeyideal
2019-03-21 16:30:21 +08:00
@SmallSir 按组存储,遍历发送

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/537635

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX