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

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

  •  1
     
  •   SoarKyle · 56 天前 · 3597 次点击
    这是一个创建于 56 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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