Java 做强联网即时对战的手游服务器的技术可行性? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
SoarKyle
V2EX    程序员

Java 做强联网即时对战的手游服务器的技术可行性?

  •  1  
  •   SoarKyle 2019-09-25 10:22:35 +08:00 7482 次点击
    这是一个创建于 2215 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT,一般强联网即时对战都采用 c++开发,java 是否可行呢? 9102 年了,Java 也有像 netty 这样比较成熟的高性能框架,而且服务器硬件性能也早就不是瓶颈了,开发效率也更高,也更易于维护。c++虽然运行效率高,但开发效率低,也会因为内存管理问题导致难以维护,甚至宕机。不知道两者之间是否还存在其他的一些差别,求教各位 v 友。

    46 条回复    2020-08-13 09:26:01 +08:00
    Raymon111111
        1
    Raymon111111  
       2019-09-25 10:24:19 +08:00
    感觉 gc 一下受不了
    luckyrayyy
        2
    luckyrayyy  
       2019-09-25 10:27:53 +08:00
    现在好像几百 GB 级别的 full gc 也可以控制在个位数的毫秒级别了,应该不是问题。我看到一个测试 zgc 回收 128G 内存平均用时 2ms
    NotNil1
        3
    NotNil1  
       2019-09-25 10:29:23 +08:00
    可以尝试 netty 框架配合新版 jdk 的 zgc。
    ZiLong
        4
    ZiLong  
       2019-09-25 10:46:04 +08:00
    netty 一般使用的是堆外内存,gc 压力较小,不说 zgc,就 jdk8 以上对 G1 的优化,就基本满足要求,建议使用 jdk11 或者 graalvm.当然,比较稳妥点的是上 C++14/17.
    另外,如果业务需求不复杂,愿意尝试,给 rust 一个机会未尝不可.
    misaka19000
        5
    misaka19000  
       2019-09-25 10:49:03 +08:00
    听过英雄联盟的服务端是 Java 开发的
    passerbytiny
        6
    passerbytiny  
       2019-09-25 10:49:49 +08:00   4
    技术可行性是肯定有的,但恰恰相反的是,开发效率是没有的,因为 Java 从来没在(低延迟)游戏上有任何平台 /引擎 /框架 /工具的积累。

    后面仅是猜测:Java,从以 Spring 为代表的 Web 应用,到 Hadoop、Storm 为代表的分布式系统应用,到像 Kettle 这样的工具性应用,不管处理的是事务性数据、流式数据、异步数据、作业数据,还是大数据,本质上都是离线准实时数据或者数据流(内存数据是镜像);而即时对战游戏,是需要在内存中直接处理有强实时交互性质的数据的。不是 Java 不能这么做,而是它的重点一直不在这方面。
    airfling
        7
    airfling  
       2019-09-25 10:50:20 +08:00
    @misaka19000 那就不难理解服务器这么烂了
    SoarKyle
        8
    SoarKyle  
    OP
       2019-09-25 10:54:43 +08:00
    @misaka19000 不可能吧,有出处吗?腾讯不是一向爱用 c++吗?
    misaka19000
        9
    misaka19000  
       2019-09-25 10:57:25 +08:00   1
    @SoarKyle #7 英雄联盟是 Riot 开发的

    >
    we use at least the following languages here
    C++ (the core game is written in this)
    Lua (core game)
    C# (game tools)
    ActionScript (game hud and pvp.net)
    Java (platform servers)
    Erlang (platform servers)
    Php/sql (web team / platform)

    http://forums.na.leagueoflegends.com/board/showthread.php?t=16318
    senninha
        10
    senninha  
       2019-09-25 10:57:35 +08:00
    超能球球,算强联网即时对战吗?后端就是 Java 开发的。
    ahmcsxcc
        11
    ahmcsxcc  
       2019-09-25 10:59:21 +08:00
    上海有不少游戏公司的后端是 java 开发的
    但是现在有一部分转 go 了
    我上家公司就是用 java 做 fps
    没什么压力
    xiaowangge
        12
    xiaowangge  
       2019-09-25 11:07:17 +08:00 via iPhone
    Netty
    Vert.x
    BBCCBB
        13
    BBCCBB  
       2019-09-25 11:07:44 +08:00
    微软都能用 c#写游戏后端
        14
    YUyu101  
       2019-09-25 11:57:38 +08:00
    netty,vertx 呗,已经是 jvm 上最快的框架了,再不行就只能 c++了
    sunny352787
        15
    sunny352787  
       2019-09-25 12:42:21 +08:00   1
    这贴没几个是做游戏的啊?都是凭感觉猜...

    其实实际情况是,游戏服务器就没有一个通用的框架或者标准,都是想用啥用啥,如果只看所谓强联网的游戏,只要支持 TCP 或者 WebSocket 就行,经手过的服务器就有 C++,Java,C#,C ( skynet ),Erlang 等等,我自己用的是 go。

    如果不限强联网的话,Python,PHP 的我也见过,反正就是看你想用啥,用啥顺手就用啥。
    MiffyLiye
        16
    MiffyLiye  
       2019-09-25 12:56:32 +08:00
    服务端有 Electronic Arts 开源的 Orbit ( Java )
    对标 Microsoft 的 Orleans ( C#)
    samael
        17
    samael  
       2019-09-25 13:49:35 +08:00
    ryd994
        18
    ryd994  
       2019-09-25 14:04:27 +08:00 via Android
    那不就是 Minecraft ?官方服还是单线程的呢
    后来被微软收购才重写的
    across
        19
    across  
       2019-09-25 14:07:02 +08:00
    Erlang go c/c++多少还听过。C#只在一个小团队见过。Java 倒真不知道。
    zjsxwc
        20
    zjsxwc  
       2019-09-25 14:13:00 +08:00
    这活 php swoole 都能干
    sunny352787
        21
    sunny352787  
       2019-09-25 14:15:35 +08:00
    @across 韩国游戏大部分都是 C#的,SQLServer 存储过程用到飞起
    ofblyt
        22
    ofblyt  
       2019-09-25 14:20:41 +08:00
    不少游戏的服务端都是 C++,轮子多一些吧,个人感觉
    zdt3476
        23
    zdt3476  
       2019-09-25 14:29:06 +08:00
    就算是强联网其实还是得看具体的游戏类型,不同游戏类型差别还是很大的。不过理论上来说,问题不大。
    th00000
        24
    th00000  
       2019-09-25 14:34:01 +08:00   2
    完全可以,
    作为游戏从业者可以大概介绍一下;
    游戏一般根据类型可以大概来区分开发语言:
    比如 SLG, 卡牌类, 这些用 Java 开发一点问题都没有, 而且开发效率很高;
    对于消消乐, 养鱼这种游戏, 也没有问题, 因为都是单局玩法, 数据交互量比较小;
    对于吃鸡, 跑跑卡丁车这种, 一般局外玩法用 Java 没有问题, 局内就没有用 Java 的了;
    对于传统 MMORPG 完全没有用 Java 开发的;

    当然不用 Java 开发的部分也不代表就用 C++, 要用的话一般是框架部分用 C++, 主要逻辑会用 Lua 开发, 效率高, 跟 C 结合起来很方便, 比如魔兽世界;

    另外不是游戏就是用长连接, 用 Java 也不代表一定用 Netty,
    英雄联盟在架构更新之前大部分服务都是基于 http 的, 仅推送服务会使用长连接。
    lcf0030
        25
    lcf0030  
       2019-09-25 14:43:20 +08:00
    我的世界 不就是 java 开发的?
    SoarKyle
        26
    SoarKyle  
    OP
       2019-09-25 14:54:06 +08:00
    @th00000 请教下局内和局外是指的一局游戏? pvp 在线匹配即时对战用 java 呢,人数不多,最多 2v2
    SoarKyle
        27
    SoarKyle  
    OP
       2019-09-25 14:56:32 +08:00
    @th00000 有英雄联盟的相关技术文章可以查阅吗?
    th00000
        28
       2019-09-25 15:00:49 +08:00
    @SoarKyle 我可以理解为你们想做一款游戏模式类似<皇室战争>这种模式的游戏吗
    对于皇室战争来说, 局外就是公会, 排名, 宝箱, 组卡, 局内就是真正开始战斗, 局外这些没问题, 局内你们再仔细考虑考虑
    dcalsky
        29
    dcalsky  
       2019-09-25 15:06:36 +08:00 via Android
    @SoarKyle socket.io 那玩意都能用,你用 java 肯定没问题
    abel1989
        30
    abel1989  
       2019-09-25 15:17:03 +08:00
    现在很多服务端都转 go 了
    CallMeReznov
        31
    CallMeReznov  
       2019-09-25 15:36:17 +08:00
    pomelo 了解一下?
    sunny352787
        32
    sunny352787  
       2019-09-25 18:57:58 +08:00
    @th00000 嗯...我手上过的俩 MMO 是用 Java 写的...
    YUyu101
        33
    YUyu101  
       2019-09-25 22:07:23 +08:00
    即时也有不同类型的吧,有的是客户端状态同步,有的要服务器模拟对局,有的可以靠动画骗过去有的不行,卡牌的不出牌都不用同步,mmo 那种和 fps 又不一样了。
    KasuganoSoras
        34
    KasuganoSoras  
       2019-09-25 22:18:15 +08:00
    Minecraft 了解下? Hypixel 最高峰十几万人在线,全球最大的小游戏服务器,服务端也用的是 Java。
    hkitdog
        35
    hkitdog  
       2019-09-25 23:26:40 +08:00 via iPhone
    Dnf 是用 C++的
        36
    starsriver  
       2019-09-26 07:20:15 +08:00 via Android
    建议 minecraft 节点
    zazalu
        37
    zazalu  
       2019-09-26 08:52:45 +08:00 via Android
    可以,但是轮子少啊
    janxin
        38
    janxin  
       2019-09-26 09:33:34 +08:00
    MMO 看类型吧,有些有 GC 也不是不能接受吧,FPS 这种高实时性要求的也能不怕 GC ?怕不是手游吧...
    nvioue
        39
    nvioue  
       2019-09-26 09:40:22 +08:00 via Android
    问游戏能不能用 Java 写,太抽象谁都无法回答。你要把问题细化。你的游戏是什么类型,对延迟是否敏感,在每个地图场景会发多少请求,每个请求要求的延迟是多少,你的代码能不能达到? 至于战斗,物品系统更不用说。
    dreamycloud
        40
    dreamycloud  
       2019-09-26 09:55:47 +08:00
    Java 内存占用要比 c/c++高,比 go 也高,只有这点必须注意
    LeeSeoung
        41
    LeeSeoung  
       2019-09-26 09:58:21 +08:00
    之前站内有看到一篇 即时战斗游戏用 java 开发 好像连画面渲染都是用 java。。
    Michaelssss
        42
    Michaelssss  
       2019-09-26 10:15:21 +08:00
    理论上我们有 Java RealTime,但是好像也没看到怎么推广,而且这种可预测 GC 时间的算法有很多前置条件,还不如干脆直接用 C++
    hkitdog
        43
    hkitdog  
       2019-09-26 11:54:31 +08:00 via iPhone
    你们抓包分析下吧,游戏客户端和服务器沟通不是用 restful
    纯用 tcp socket 的...像 DNF 和 pubg
    dosmlp
        44
    dosmlp  
       2019-09-26 15:26:31 +08:00 via Android
    上 c++就对了,开发效率在游戏服务器这个领域没啥差别,反正都是从 0 开始写的,而且 java 资源占用多,可优化空间也少,至于 c 艹的内存管理,现在都 9102 年了,当然用 c 艹 /14 / 17 / 20 啊
    SoarKyle
        45
    SoarKyle  
    OP
       2019-09-29 10:00:38 +08:00
    @nvioue 游戏是延迟敏感的,有点类似在线 1v1 动作格斗
    livepps
        46
    livepps  
       2020-08-13 09:26:01 +08:00 via Android
    分进程,也可以说分服务器,战斗服务器用 c++ 写,其他服务器用 java,java 相比 c++ 开发效率确实高,ide 也很好用
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2798 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:03 PVG 15:03 LAX 00:03 JFK 03:03
    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