Node.js实时游戏

8

是否可能使用Node.js创建一个需要快速反应的实时游戏?延迟有多高?它能降到多低?

3个回答

14

在node.js中,像其他编程语言/框架一样,可以制作实时游戏。

问题在于你需要使用什么类型的服务器和客户端。
为此类游戏使用http服务器特性是一个不好的选择,而且很困难,但你可以使用TCP服务器(现在称为net服务器),就像在任何其他语言中一样。

客户端可以在支持套接字的平台上使用,例如Flash、Java小程序或桌面软件。

请注意,即使使用TCP套接字服务器,你也可能会遇到延迟问题,这与本问题无关,更多地涉及游戏和网络

PS:虽然理论上Web套接字应该像TCP套接字一样工作,但目前主流浏览器尚未对其进行良好的支持,因此你可以使用Web套接字,但效果不佳。


编辑:

看来我的表述有些不清楚,像你说的那样,你可以制作基于浏览器的游戏,只需要使用允许你在实时情况下快速发送数据的协议即可。

如果您想要一个"纯"的浏览器游戏而没有任何第三方插件,那么唯一的方式就是使用JavaScriptWeb套接字,但目前主流浏览器对其支持不好。(你可以使用Flash桥接,仍然可以在JavaScript中运行您的游戏。)

使用第三方插件,您可以使用FlashJava(以及其他许多不太知名的插件,如Unity等)。两者都有TCP套接字(不确定是否支持UDP),并可以连接到一个node.js网络服务器(具有某些安全限制)。大多数人会建议您选择Flash,因为它得到了更大的支持,但是苹果公司不喜欢它,因此iPhone / iPad / iPod Touch或其他杂项移动设备上没有Flash(而支持Java)。

所以...祝你好运。

编辑2:

现在浏览器中对Websocket的支持相当不错,因此如果您想要使用浏览器作为客户端进行实时游戏,则建议使用它。


8
使用TCP来进行游戏不是一个明智的选择,UDP才是更好的方法。 - o0'.
8
我完全不同意。在游戏中使用UDP并不是一个很明智的选择,TCP才是正确的方法。 - Ricket
无论如何,在这些平台上UDP的支持都更少。 (我不记得Flash是否支持它,我认为Java Apples支持它。) - Diogo Gomes
8
这取决于游戏类型。如果你正在制作回合制游戏,TCP可能是更好的选择。然而,如果你正在制作实时游戏,UDP会是更好的选择。 - Brian DiCasa
@Brian同意。TCP对于实时数据来说开销太大了。如果其中一个或多个用户的连接延迟较高,服务器将会受到大量的数据重发请求。这不仅会增加服务器的负载,而且传输到客户端的数据将会被卡住等待新的数据包到达和数据重新组装(进一步使状态失去同步)。TCP的延迟弱点是实时数据情况下的滞后倍增器。 - Evan Plaice
@Ricket - 列出5个使用UDP作为传输协议的游戏引擎。列出5个使用TCP作为传输协议的游戏引擎。比较网络游戏的评分。那不是很简单吗?难点在于客户端预测,这是黑魔法。由于已经向糟糕的连接发送了可能已经过时的流,因此TCP通常不被行业视为前进的方式。在2013年,一般共识是UDP / P2P模型是高延迟“One Canonical Server”方法的行业实践。例如-参见UE4 / iDTech 5 / Frostbite / 星际争霸2引擎等 - mseddon

6

HTTP服务器通常针对吞吐量/带宽进行优化而非延迟。node.js不太可能是一个例外,而且由于协议结构的原因,HTTP本质上对于低延迟是很差的。

使用node.js的一项非正式基准测试支持了这个观点,显示数百毫秒的延迟。相比之下,大多数twitch游戏支持最多30或40ms的延迟,理想情况下更少。

因此,如果无法放弃HTTP,则建议您放弃twitch方面的考虑。


12
我不明白HTTP与此有什么关系。对于多人游戏中玩家之间低延迟的更新,人们通常使用UDP或TCP,而Node.js都可以实现。 - JasonWoof
4
你说得很对。不过,当我发布这个答案时,很少有人谈论除作为 Web 服务器外的任何使用 Node.js 的事情,而且 UDP 支持还要再过两个月才能出现。 - Kylotan
4
啊哈 :) 对我来说,Node.js 的开发速度非常惊人。 - JasonWoof
根据我在一个预定使用nodejs的项目上进行故障排除的经验(我很高兴被纠正!),大多数nodejs性能方面的声明都是基于低延迟而不是高吞吐量。Nodejs在性能方面并没有什么新意(阅读-相当于协作式多任务处理,具有所有缺陷)。在OP的情况下,延迟是要求-所以可以尝试,但是...要明智选择。在我可以提交某些内容进行处理并返回“好的,我已经得到了它并且看起来有效”的响应的情况下,我强烈感觉nodejs正在向未受过教育的人们推销。你有什么想法? - mseddon

4

这是可能的,但取决于服务器和客户端之间需要传输多少数据以及传输速度(延迟)。例如,请查看Sousaball by Creationix

另外,如果您计划使用WebSockets,请查看learnboost的Socket.IO库。它在可用时使用WebSockets,并在其他情况下回退到Comet。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接