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

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

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

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

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

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

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

4707 次点击
所在节点    程序员
30 条回复
waibunleung
2019-02-22 15:17:38 +08:00
默默收藏了几个,然而没有人回复,我是不是投错节点了?
jsun
2019-02-22 15:29:09 +08:00
C++和 node.js 的游戏写过,go 没接触过,但是一般不都是每个玩家绑定根据玩家 ID 绑定一个 socket,协程池管理是什么鬼。另外是不是应该先做出点东西,再考虑多人游戏这部分。
xkeyideal
2019-02-22 15:36:14 +08:00
这还不简单,按照房间进行分组,每个分组里面的成员与服务器保持一个长连接,建议使用 websocket,消息的传播可以分为:组内广播,组内 /跨组单播,跨组广播,跨组指定成员广播。

看一下 golang websocket 的操作即可,姿势正确,代码很好写
hehe12dyo
2019-02-22 15:40:23 +08:00
你怕是想做棋牌的哦
ahmcsxcc
2019-02-22 15:48:02 +08:00
你根本没有做游戏的思想,还想着用 web 那一套去搞
waibunleung
2019-02-22 16:03:48 +08:00
@ahmcsxcc 我前提已经说过了,请这位童鞋好好审题。
另外思想这些东西也是需要学习的,不是一想就来。
我发这个主题的意思就是想得到大家的指点,而不是告诉我一些我已经知道的东西(没有做游戏的思想,还想着用 web 那一套去搞),不过还是谢谢你指出的问题
waibunleung
2019-02-22 16:04:43 +08:00
@hehe12dyo 不是噢,不过就是有点类似,不知道有没有好的办法
waibunleung
2019-02-22 16:09:50 +08:00
@jsun 小程序前端这一块进度已经是 80%,差与后台重要部分的对接,这部分就是我在问题上面问的,可能这点没在问题上说清楚,我的锅。
协程池是基于我在问题上面描述的思路提出来的,不具有普遍性。
另外回复上面你只告诉我每个玩家根据 ID 绑定一个 socket,这个是必然的,但是房间的话怎么处理呢?
希望能具体说说你们一般是怎么做的,感谢~
waibunleung
2019-02-22 16:14:42 +08:00
@xkeyideal 感动,你是第一位审题正确的同学!
但是我有几个问题想问:
1.房间的载体可以是什么? map?channel?goroutine?
2.感觉你说的思路跟我在问题里面提出来的差不多,不知道是否有改进空间?
zjsxwc
2019-02-22 16:20:35 +08:00
对实时性要求不高的话,简单粗暴 http json 接口解决,搞个 golang 的 web 开发框架就行。

如果是王者荣耀这种实时要求高的,用 kcp 协议基于 udp 也不用 tcp 长连接。
tcfenix
2019-02-22 16:21:31 +08:00
传统的游戏服务器是 gateway 集群负责维护长连接,然后登陆到 homeserver,之后创建房间就是在 roomserver 上建立一个 room 结构体,把人放进去
单线程死循环遍历 room 结构体做各种超时之类的处理
每次房间内有什么变化就广播给房间里面所有人,这边用协程处理挺不错的

golang 中要实现看你是打算改动多少,你要是想把时间什么的事件化那倒是可以不需要死循环
tcfenix
2019-02-22 16:22:00 +08:00
tcfenix
2019-02-22 16:23:21 +08:00
@zjsxwc
kcp 本身也是长连接啊,而且关于 rudp 这个问题其实争议非常多
tcfenix
2019-02-22 16:24:56 +08:00
@waibunleung
一般房间的载体就是一个结构体,放在一个定长,比如 10000 或者 10000 的数组里面
然后通过一个 map 对这个数组做一个索引,不要想得太复杂
waibunleung
2019-02-22 16:27:23 +08:00
@tcfenix 很好~但是现在我手上就一台可调用的服务器,不过参照你的说法,我感觉有点小小的眉目,谢谢你~
mosliu
2019-02-22 16:28:16 +08:00
和聊天室一样的吧 维护一个在线结构体 这个结构体放入一个 ws 和相应的用户信息就可以
然后在定义一个聊天室的结构体 内存储相应的在线用户, 收发广播消息时候 循环发送给所有用户不就可以了?


是我想简单了吧?
mosliu
2019-02-22 16:30:02 +08:00
多个房间的话。 每个房间一个携程 阻塞一个或多个 channel 有消息扔 channel 不就可以了。
tcfenix
2019-02-22 16:30:06 +08:00
@waibunleung
这里的各个服务器其实指的是进程,比如 gateway 开个几个进程,homeserver 开几个进程,你想分开就分开部署在不同服务器上,不过这个架构也许对你的业务场景来说有点重,可以合并起来,以后有必要再切分
xkeyideal
2019-02-22 16:48:04 +08:00
@waibunleung 知道我为啥审题正确么?虽然不是做游戏,但类似这种需求的项目我写过好多个了。

你说的载体我不是很明白,定义一个 struct,把 ws 长连接的 conn 放进去,然后另开 goroutine 搞呗。

如果还不懂,去找个 example 看看,学起来轻松一点。

友情提示:自己玩玩 websocket 随便搞,考虑性能和功能的话,很多事情要做
waibunleung
2019-02-22 16:54:08 +08:00
@xkeyideal 好的,非常感谢~

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

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

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

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

© 2021 V2EX