Java 游戏后端开发入门, 涉及 quarkus vertx 最近一些思考

2022-09-08 09:52:11 +08:00
 ddonano
最近项目组开发直播在线类 unity 游戏,类似于 MMO 游戏,有房间、 多人在线概念,房间内人员加入、走动、退出,都要通知到的房间内其他人,所以需要一个高性能用户状态(主要是坐标位置信息)消息广播转发服务,当前的服务 基于 nodejs ,使用 koa 路由,grpc 转发,
由于本人一直从事 java 后端开发,所以想用 java 开发一个消息转发服务。

网上找资料零零散散找了很久,目前已经出来一个基础的 demo ,

基本架构:
提供的 url: interface/{userId}/{teamId}

负载:使用 nginx url hash
通过 hash teamId 将相同房间的负载到同一台机器,规避了服务器间相互调用。

服务:
使用了 quarkus 自带的 ServerEndpoint 注解的 websocket ,自带的 websocket 好像目前版本也用到了 vertx 这些,自己创建 map 管理 组内成员状态,这样组内广播也是单服务广播,暂时基本满足需求,无须全服广播,后期不确定有没有这个需求。 后期准备加入 verx cluster 这些特性,支持分布式。

目前进展:
正在找工具压测,
压测目标: 至少 100 个连接同时在一个房间内,一个新成员加入房间,随机生成坐标信息,通知到房内所有人(最大 99 人),同时房间内所有人当前坐标信息通知给这个新成员( 99+1 条消息)。当成员移动时,将坐标信息 发给房间内所有其他人( 99 条消息)。


网上找了一个工具 https://github.com/MirrenTools/Orion-Stress-Tester ,魔改了一下,支持我当前服务接口的 动态传参,但是初步测试了下,感觉性能也不是很强,是不是 quarkus 自带的 websocket 不是很强,看了下基于 undertow ,压测一会就有连接报错,感觉性能也不是很强?有大佬知道啥原因不,或者有兴趣的,一起交流下,
或者有其他 websocket 高性能广播转发开源组件 也可以推荐,谢谢大佬们了。
4688 次点击
所在节点    程序员
34 条回复
bruce0
2022-09-08 09:56:47 +08:00
第一次见用 Java 写游戏服务器的, 插眼学习一下
newmlp
2022-09-08 09:58:21 +08:00
游戏不是用 udp 加自己魔改可靠连接的多吗,比如 kcp
RedBeanIce
2022-09-08 09:58:49 +08:00
指不定你发到 Java 节点会更好。。。。。
robot1
2022-09-08 10:01:21 +08:00
感觉你不太懂游戏开发啊。得了解下基本的游戏开发模式和关注的点吧。
你这感觉还是在搞 web
cqu1980
2022-09-08 10:04:41 +08:00
既然用 node 开发,为啥不用现成的框架,比如 pinus ?
dk7952638
2022-09-08 10:07:14 +08:00
我有一种偏见,所有带 GC 的编程语言都不适合做游戏开发
ddonano
2022-09-08 10:07:49 +08:00
大佬,所以写的是入门啊
ddonano
2022-09-08 10:08:35 +08:00
@robot1 大佬,所以写的是入门啊
bruce0
2022-09-08 10:16:06 +08:00
@robot1 我也感觉是在用写 web 的思路写游戏😆
kwh
2022-09-08 10:18:25 +08:00
可能是连接数量限制???
robot1
2022-09-08 10:24:17 +08:00
看很多评论关注语言、协议、gc 什么的,
但对于题主来说我觉的还是先看看书资料源码,弄清楚游戏开发的基本知识才是主要的
可以看 quake3 的快照同步,或者别的什么的帖同步,状态同步 ,客户端预测回滚啥的
语言之类的都是用来实现这套模式的工具,可以根据游戏类型灵活选择
qinxi
2022-09-08 10:25:13 +08:00
nodejs 不是有 socketio. java 可以不用参与了.
非要 java, 不是也有 netty-socketio. 直接 netty 生撸也行
micean
2022-09-08 10:33:11 +08:00
当前基于 nodejs ,改成 java 的原因是啥?
vertx eventbus 发消息是一个一个发……估计和 nodejs 版本也没啥区别
如果性能符合你的要求也没啥问题
assiadamo
2022-09-08 10:40:49 +08:00
如果是纯客户端计算,服务器只存个结果,或者演算的话,你用 web 那套没问题
长连接的话,老老实实用 netty 吧
cqu1980
2022-09-08 10:41:27 +08:00
@robot1 确实是这么个道理,还是要结合一些游戏框架来熟悉分析和理解才行,光靠自己想肯定是不行的。不过 java 的游戏框架不多,可以参考 node 的 pinus/pomelo 。
ddonano
2022-09-08 10:46:50 +08:00
@assiadamo https://github.com/quarkusio/quarkus/issues/8805 好像 quarkus 的 websocket 就是基于 netty 的,我也看了源码,有使用到 netty 的 Channel 、ChannelHandler 这些。
assiadamo
2022-09-08 10:52:14 +08:00
@ddonano 看你需求,如果是 pc 端或者手机端,能用 websocket 为什么直接用 tcp/udp 呢,websocket 用在游戏上可能网页游戏更适合
allgy
2022-09-08 10:57:44 +08:00
java GC 直接卡你的怀疑人生
lmshl
2022-09-08 11:09:14 +08:00
既然是 Java 的话,akka-cluster-sharding 了解一下,国内腾讯网易淘宝游戏等都有应用,轻松扛百万玩家在线

@allgy 今年是 2022 年,Pauseless GC 已经诞生十几年了
lmshl
2022-09-08 11:28:30 +08:00
https://devsisters.github.io/shardcake/docs/#a-simple-use-case
这两天刚发现的新 JVM 项目,也是可以面向游戏场景应用的

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

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

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

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

© 2021 V2EX