V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ddonano
V2EX  ›  程序员

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

  •  
  •   ddonano · 2022-09-08 09:52:11 +08:00 · 4668 次点击
    这是一个创建于 833 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近项目组开发直播在线类 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 没什么门槛
    q1angch0u
        30
    q1angch0u  
       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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3120 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:56 · PVG 20:56 · LAX 04:56 · JFK 07:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.