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

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

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

    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#写游戏后端
    YUyu101
        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
    th00000  
       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++寫的
    starsriver
        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   ·   我们的愿景   ·   实用小工具   ·   2770 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:24 · PVG 08:24 · LAX 17:24 · JFK 20:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.