• 请不要在回答技术问题时复制粘贴 AI 生成的内容
SoarKyle
V2EX  ›  程序员

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

  •  1
     
  •   SoarKyle · Sep 25, 2019 · 8503 views
    This topic created in 2601 days ago, the information mentioned may be changed or developed.

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

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

    后面仅是猜测:Java,从以 Spring 为代表的 Web 应用,到 Hadoop、Storm 为代表的分布式系统应用,到像 Kettle 这样的工具性应用,不管处理的是事务性数据、流式数据、异步数据、作业数据,还是大数据,本质上都是离线准实时数据或者数据流(内存数据是镜像);而即时对战游戏,是需要在内存中直接处理有强实时交互性质的数据的。不是 Java 不能这么做,而是它的重点一直不在这方面。
    airfling
    airfling
    Sep 25, 2019
    7
    @misaka19000 那就不难理解服务器这么烂了
    SoarKyle
    SoarKyle
    OP
    Sep 25, 2019
    8
    @misaka19000 不可能吧,有出处吗?腾讯不是一向爱用 c++吗?
    misaka19000
    misaka19000
    Sep 25, 2019❤️1
    9
    @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
    senninha
    Sep 25, 2019
    10
    超能球球,算强联网即时对战吗?后端就是 Java 开发的。
    ahmcsxcc
    ahmcsxcc
    Sep 25, 2019
    11
    上海有不少游戏公司的后端是 java 开发的
    但是现在有一部分转 go 了
    我上家公司就是用 java 做 fps
    没什么压力
    xiaowangge
    xiaowangge
    Sep 25, 2019 via iPhone
    12
    Netty
    Vert.x
    BBCCBB
    BBCCBB
    Sep 25, 2019
    13
    微软都能用 c#写游戏后端
    YUyu101
    YUyu101
    Sep 25, 2019
    14
    netty,vertx 呗,已经是 jvm 上最快的框架了,再不行就只能 c++了
    sunny352787
    sunny352787
    Sep 25, 2019❤️1
    15
    这贴没几个是做游戏的啊?都是凭感觉猜...

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

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

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

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