V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ddonano
V2EX  ›  程序员

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

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

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

    bthulu
        21
    bthulu  
       193 天前
    @robot1 网页游戏这么搞有啥问题? 难道浏览器里能用 socket 了?
    joesonw
        22
    joesonw  
       193 天前 via iPhone
    0 游戏基础的 Java 话直接用 SmartFoxServer
    dcoder
        23
    dcoder  
       193 天前   ❤️ 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  
       193 天前
    @newmlp #2 要可靠就 tcp, 要不可靠用 raw udp, 比如语音、实时坐标数据等
    ForkNMB
        25
    ForkNMB  
       193 天前
    @bruce0 传奇游戏就用 java 写的啊。横版手游,同屏几十人还行吧哈哈哈
    ddonano
        26
    ddonano  
    OP
       193 天前
    @dcoder 大佬牛逼!!!我学习下 kcp
    th00000
        27
    th00000  
       193 天前
    利益相关, 用 Vert.x 开发过线上吃鸡类游戏
    但是 MMO 类型的话有待验证, 毕竟单线程可以容纳的在线人数有限, 吃鸡类就没这个问题, 大厅扩就是了
    但是你也说过你的游戏是有房间概念的, 所以我觉得问题不大

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

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

    压测可以用 galting 的 websocket module ,用 scala 简单写点代码,都是 DSL API 没什么门槛
    q1angch0u
        30
    q1angch0u  
       193 天前
    好奇游戏场景下 GC 的 STW 咋处理……
    xf5464
        31
    xf5464  
       193 天前
    移动同步的话,客户端这边按格子走,然后走到下一格的时候,服务端用上一次收到的移动格子时间和这次的时间差判断,是不是可以移动到当前格子,可以的话通知给其他人。每一格都验证,可能跟你说的移动不是一个事,比如一个格子 64*32 ,那么当客户端移动了很小的一段路,没到下一个格子的时候,是不会通知服务端的,也就不会通知到其他玩家。
    Huelse
        32
    Huelse  
       193 天前
    @lmshl #19 今天刚看到 akka 改 license 了,不过年收入$2500w 以内问题不大 https://www.lightbend.com/blog/why-we-are-changing-the-license-for-akka
    lmshl
        33
    lmshl  
       193 天前
    @Huelse 呜呜呜😭,哪壶不开提哪壶,呜呜呜😭
    dqzcwxb
        34
    dqzcwxb  
       193 天前
    @allgy #18
    关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   996 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 22:20 · PVG 06:20 · LAX 15:20 · JFK 18:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.