Java 游戏后端开发入门, 涉及 quarkus vertx 最近一些思考 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ddonano
V2EX    程序员

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

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

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

    bthulu
        21
    bthulu  
       2022-09-08 11:49:15 +08:00
    @robot1 网页游戏这么搞有啥问题? 难道浏览器里能用 socket 了?
    joesonw
        22
    joesonw  
       2022-09-08 12:05:24 +08:00 via iPhone
    0 游戏基础的 Java 话直接用 SmartFoxServer
    dcoder
        23
    dcoder  
       2022-09-08 12:23:39 +08:00   3
    你们上面滔滔不绝的基本都没说在点子上...
    首先该问贴主是做: real-time 的游戏 (e.g. 竞技 ACT, FPS), 还是 turn-based 的游戏?
    turn-based 的话, websocket 这一套没有问题, 并且 websocket+stateful 的构架 还是比 Restful+stateless 的要难写.

    但是要做 real-time 的话, 难度就几何级数上升:
    1. 需要在 UDP 上用个快速的传输协议 (比如 KCP).
    2. 需要在 server 和 client 端自己计算没帧的物理模拟(哪怕是最简单的也行). server 和 client 可以用不同的语言. 这里水也很深. 竞技游戏的话, 多半会基于 deterministic floating number 做 simulation. MMORPG 的话可以用差值糊弄糊弄, 不用每帧都是精确的 deterministic simulation.
    lysS
        24
    lysS  
       2022-09-08 13:51:56 +08:00
    @newmlp #2 要可靠就 tcp, 要不可靠用 raw udp, 比如语音、实时坐标数据等
    ForkNMB
        25
    ForkNMB  
       2022-09-08 14:20:48 +08:00
    @bruce0 传奇游戏就用 java 写的啊。横版手游,同屏几十人还行吧哈哈哈
    ddonano
        26
    ddonano  
    OP
       2022-09-08 15:41:19 +08:00
    @dcoder 大佬牛逼!!!我学习下 kcp
    th00000
        27
    th00000  
       2022-09-08 16:01:42 +08:00
    利益相关, 用 Vert.x 开发过线上吃鸡类游戏
    但是 MMO 类型的话有待验证, 毕竟单线程可以容纳的在线人数有限, 吃鸡类就没这个问题, 大厅扩就是了
    但是你也说过你的游戏是有房间概念的, 所以我觉得问题不大

    另外 Netty 是 Netty, Vert.x 是 Vert.x, 不是两个互斥的技术栈
    th00000
        28
    th00000  
       2022-09-08 16:04:06 +08:00
    @th00000 #27 根据当时的压测结果, 8 核 32G 在线人数远远超你要做的 100 人
    cloud107202
        29
    cloud107202  
       2022-09-08 16:06:34 +08:00
    shardcake 这种不说成不成熟,effect-system 的框架就这么推荐新手用?

    题主就从 linux 最大连接数、web server 线程池、所用具体 websocket 组件的 IO 操作是同步还是异步等几个地方依次排查下就行

    压测可以用 galting 的 websocket module ,用 scala 简单写点代码,都是 DSL API 没什么门槛
    ryanbuu
        30
    ryanbuu  
       2022-09-08 16:07:29 +08:00
    好奇游戏场景下 GC 的 STW 咋处理……
    xf5464
        31
    xf5464  
       2022-09-08 16:08:06 +08:00
    移动同步的话,客户端这边按格子走,然后走到下一格的时候,服务端用上一次收到的移动格子时间和这次的时间差判断,是不是可以移动到当前格子,可以的话通知给其他人。每一格都验证,可能跟你说的移动不是一个事,比如一个格子 64*32 ,那么当客户端移动了很小的一段路,没到下一个格子的时候,是不会通知服务端的,也就不会通知到其他玩家。
    Huelse
        32
    Huelse  
       2022-09-08 16:20:09 +08:00
    @lmshl #19 今天刚看到 akka 改 license 了,不过年收入$2500w 以内问题不大 https://www.lightbend.com/blog/why-we-are-changing-the-license-for-akka
    lmshl
        33
    lmshl  
       2022-09-08 16:55:11 +08:00
    @Huelse 呜呜呜,哪壶不开提哪壶,呜呜呜
    dqzcwxb
        34
    dqzcwxb  
       2022-09-08 17:03:31 +08:00
    @allgy #18
    style type="text/css">.wwads-cn { border-radius: 3px !important; } .wwads-text { color: var(--link-color) !important; }
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     988 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 19:17 PVG 03:17 LAX 11:17 JFK 14:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86