RT,一般强联网即时对战都采用 c++开发,java 是否可行呢? 9102 年了,Java 也有像 netty 这样比较成熟的高性能框架,而且服务器硬件性能也早就不是瓶颈了,开发效率也更高,也更易于维护。c++虽然运行效率高,但开发效率低,也会因为内存管理问题导致难以维护,甚至宕机。不知道两者之间是否还存在其他的一些差别,求教各位 v 友。
1
Raymon111111 2019-09-25 10:24:19 +08:00
感觉 gc 一下受不了
|
2
luckyrayyy 2019-09-25 10:27:53 +08:00
现在好像几百 GB 级别的 full gc 也可以控制在个位数的毫秒级别了,应该不是问题。我看到一个测试 zgc 回收 128G 内存平均用时 2ms
|
3
NotNil1 2019-09-25 10:29:23 +08:00
可以尝试 netty 框架配合新版 jdk 的 zgc。
|
4
ZiLong 2019-09-25 10:46:04 +08:00
netty 一般使用的是堆外内存,gc 压力较小,不说 zgc,就 jdk8 以上对 G1 的优化,就基本满足要求,建议使用 jdk11 或者 graalvm.当然,比较稳妥点的是上 C++14/17.
另外,如果业务需求不复杂,愿意尝试,给 rust 一个机会未尝不可. |
5
misaka19000 2019-09-25 10:49:03 +08:00
听过英雄联盟的服务端是 Java 开发的
|
6
passerbytiny 2019-09-25 10:49:49 +08:00 4
技术可行性是肯定有的,但恰恰相反的是,开发效率是没有的,因为 Java 从来没在(低延迟)游戏上有任何平台 /引擎 /框架 /工具的积累。
后面仅是猜测:Java,从以 Spring 为代表的 Web 应用,到 Hadoop、Storm 为代表的分布式系统应用,到像 Kettle 这样的工具性应用,不管处理的是事务性数据、流式数据、异步数据、作业数据,还是大数据,本质上都是离线准实时数据或者数据流(内存数据是镜像);而即时对战游戏,是需要在内存中直接处理有强实时交互性质的数据的。不是 Java 不能这么做,而是它的重点一直不在这方面。 |
7
airfling 2019-09-25 10:50:20 +08:00
@misaka19000 那就不难理解服务器这么烂了
|
8
SoarKyle OP @misaka19000 不可能吧,有出处吗?腾讯不是一向爱用 c++吗?
|
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 |
10
senninha 2019-09-25 10:57:35 +08:00
超能球球,算强联网即时对战吗?后端就是 Java 开发的。
|
11
ahmcsxcc 2019-09-25 10:59:21 +08:00
上海有不少游戏公司的后端是 java 开发的
但是现在有一部分转 go 了 我上家公司就是用 java 做 fps 没什么压力 |
12
xiaowangge 2019-09-25 11:07:17 +08:00 via iPhone
Netty
Vert.x |
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++了
|
15
sunny352787 2019-09-25 12:42:21 +08:00 1
这贴没几个是做游戏的啊?都是凭感觉猜...
其实实际情况是,游戏服务器就没有一个通用的框架或者标准,都是想用啥用啥,如果只看所谓强联网的游戏,只要支持 TCP 或者 WebSocket 就行,经手过的服务器就有 C++,Java,C#,C ( skynet ),Erlang 等等,我自己用的是 go。 如果不限强联网的话,Python,PHP 的我也见过,反正就是看你想用啥,用啥顺手就用啥。 |
16
MiffyLiye 2019-09-25 12:56:32 +08:00
服务端有 Electronic Arts 开源的 Orbit ( Java )
对标 Microsoft 的 Orleans ( C#) |
17
samael 2019-09-25 13:49:35 +08:00
@sunny352787 同意
就我所知道,CoC 的服务器就是 Java https://www.pocketgamer.biz/feature/45814/chart-rush-making-of-clash-of-clans/ |
18
ryd994 2019-09-25 14:04:27 +08:00 via Android
那不就是 Minecraft ?官方服还是单线程的呢
后来被微软收购才重写的 |
19
across 2019-09-25 14:07:02 +08:00
Erlang go c/c++多少还听过。C#只在一个小团队见过。Java 倒真不知道。
|
20
zjsxwc 2019-09-25 14:13:00 +08:00
这活 php swoole 都能干
|
21
sunny352787 2019-09-25 14:15:35 +08:00
@across 韩国游戏大部分都是 C#的,SQLServer 存储过程用到飞起
|
22
ofblyt 2019-09-25 14:20:41 +08:00
不少游戏的服务端都是 C++,轮子多一些吧,个人感觉
|
23
zdt3476 2019-09-25 14:29:06 +08:00
就算是强联网其实还是得看具体的游戏类型,不同游戏类型差别还是很大的。不过理论上来说,问题不大。
|
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 的, 仅推送服务会使用长连接。 |
25
lcf0030 2019-09-25 14:43:20 +08:00
我的世界 不就是 java 开发的?
|
26
SoarKyle OP @th00000 请教下局内和局外是指的一局游戏? pvp 在线匹配即时对战用 java 呢,人数不多,最多 2v2
|
28
th00000 2019-09-25 15:00:49 +08:00
@SoarKyle 我可以理解为你们想做一款游戏模式类似<皇室战争>这种模式的游戏吗
对于皇室战争来说, 局外就是公会, 排名, 宝箱, 组卡, 局内就是真正开始战斗, 局外这些没问题, 局内你们再仔细考虑考虑 |
30
abel1989 2019-09-25 15:17:03 +08:00
现在很多服务端都转 go 了
|
31
CallMeReznov 2019-09-25 15:36:17 +08:00
pomelo 了解一下?
|
32
sunny352787 2019-09-25 18:57:58 +08:00
@th00000 嗯...我手上过的俩 MMO 是用 Java 写的...
|
33
YUyu101 2019-09-25 22:07:23 +08:00
即时也有不同类型的吧,有的是客户端状态同步,有的要服务器模拟对局,有的可以靠动画骗过去有的不行,卡牌的不出牌都不用同步,mmo 那种和 fps 又不一样了。
|
34
KasuganoSoras 2019-09-25 22:18:15 +08:00
Minecraft 了解下? Hypixel 最高峰十几万人在线,全球最大的小游戏服务器,服务端也用的是 Java。
|
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 节点
|
37
zazalu 2019-09-26 08:52:45 +08:00 via Android
可以,但是轮子少啊
|
38
janxin 2019-09-26 09:33:34 +08:00
MMO 看类型吧,有些有 GC 也不是不能接受吧,FPS 这种高实时性要求的也能不怕 GC ?怕不是手游吧...
|
39
nvioue 2019-09-26 09:40:22 +08:00 via Android
问游戏能不能用 Java 写,太抽象谁都无法回答。你要把问题细化。你的游戏是什么类型,对延迟是否敏感,在每个地图场景会发多少请求,每个请求要求的延迟是多少,你的代码能不能达到? 至于战斗,物品系统更不用说。
|
40
dreamycloud 2019-09-26 09:55:47 +08:00
Java 内存占用要比 c/c++高,比 go 也高,只有这点必须注意
|
41
LeeSeoung 2019-09-26 09:58:21 +08:00
之前站内有看到一篇 即时战斗游戏用 java 开发 好像连画面渲染都是用 java。。
|
42
Michaelssss 2019-09-26 10:15:21 +08:00
理论上我们有 Java RealTime,但是好像也没看到怎么推广,而且这种可预测 GC 时间的算法有很多前置条件,还不如干脆直接用 C++
|
43
hkitdog 2019-09-26 11:54:31 +08:00 via iPhone
你们抓包分析下吧,游戏客户端和服务器沟通不是用 restful
纯用 tcp socket 的...像 DNF 和 pubg |
44
dosmlp 2019-09-26 15:26:31 +08:00 via Android
上 c++就对了,开发效率在游戏服务器这个领域没啥差别,反正都是从 0 开始写的,而且 java 资源占用多,可优化空间也少,至于 c 艹的内存管理,现在都 9102 年了,当然用 c 艹 /14 / 17 / 20 啊
|
46
livepps 2020-08-13 09:26:01 +08:00 via Android
分进程,也可以说分服务器,战斗服务器用 c++ 写,其他服务器用 java,java 相比 c++ 开发效率确实高,ide 也很好用
|