使用node.js / socket.io构build一个实时的大型多人游戏有多昂贵?

您好,我正在尝试使用node.js和socket.io构build一个实时多人游戏。

现在,在编码方面实现本身并不是什么大问题,但是来自传统的http请求响应web编程模型,我不知道在stream量和服务器负载方面会有多昂贵。 基本上在游戏期间,玩家的浏览器应当跟踪实时的鼠标input事件,并且将其广播给同一游戏中的所有其他玩家。

下面是一个例子,假设我的头像围绕我的鼠标指针在屏幕上显示,并且应该实时播放给屏幕上的其他玩家。 我会做这样的事情:

// client side $(document).on("mousemove", function(event){ io.emit("coordinate", {x: event.pageX, y: event.pageY}); }); 

并在服务器上:

 // server side io.sockets.on("connection", function(socket){ ... socket.on("coordinate", function(coordinate){ socket.get("username", function(err, username){ socket.broadcast.emit("move", {username: username, coordinate:coordinate}); }); }); ... }); 

我认为这应该起作用,但是这需要浏览器每秒向服务器发送几个事件,随后应该向同一游戏中的其余玩家广播它们,并且我担心这个事情的含义。 有一件事是,每个传输的数据片段的大小不是那么大(基本上只是一个x和y坐标)。 如果这太贵,不pipe这个游戏多么伟大,我都不认为我能发货。 谁能开导我吗? 谢谢。

[编辑]澄清,我不问如何使这个架构更有效率。 我只想知道这种types的系统在系统负载(和维护成本)方面是否足够现实对于普通的Web服务,我可以通过查看页面视图数字来估计成本,但websocket是一个全新的领域,我不知道的,所以我想问。

警告:下面的所有数字都是估计的,在好几个地方都有开销,但是应该给你开始的地方。

如果你只是在连接之间来回传输数据,那么服务器似乎不太可能成为你的瓶颈。 我想你会用带宽(在玩家端和/或数据中心端)打出你的第一堵墙。

假设每个用户每秒平均推送25次鼠标数据,这意味着每个用户每秒下载25个播放器 。 假设每个鼠标移动消息是100字节,有20个玩家 ,这意味着你(天真地)下载~50kb每秒 ,这是相当高,但可以实现。 我天真地说,因为会有开销,但有一个体面的连接感觉可以实现。

下载带宽与玩家数量成线性关系,所以在100名玩家中,客户端的数据传输速度将更快,达到250kb / s,服务器端的传输速率将达到22Mb / s

如果你需要更多的玩家,你需要find最优化的方法,例如修剪消息,数据压缩,限制鼠标采样速度等。

100万美元的问题是: I just want to know if this type of system is realistic enough in terms of system load (and maintenance cost) 。 我觉得这是非常相对的。 相对于编码,硬件,用户数量。

莱昂的build议是好的,只跟踪鼠标点击,不跟踪鼠标移动。 在这种游戏中,每个减less请求/响应的策略都是受欢迎的。

回答你的问题,我再次说,这是相对的,你的startegy(使用node.js和websockets)听起来不错,它可以同时为1.000用户工作,但不能为1.000.000工作,但是,相同的代码,与一个更好的硬件,可以为1,000,000,1,000,000,1,000,000,000用户工作,这是一个基础设施问题。 我认为这个前提是be carefully in your code to mantain the system lightwheigtbe carefully in your code to mantain the system lightwheigt ,因为如果你知道你的代码是好的,那么问题将会是硬件,带宽等等(你可以稍后关心这个问题)。

化身是否真的要跟随鼠标或他们将移动到地图上点击的位置? 如果是后者,那么你只需要传送点击位置到服务器,服务器只需要广播头像航点和旅行速度的客户端。

这对于需要pipe理多less个对象和玩家仍然有限制,但是服务器可以为多个化身和对象收集1/10秒或1/4秒的动作,并将其作为一个包从而减lessnetworking,服务器和客户端的负载。

我做了一些非常相似的事情

所有玩家以自己的速度向服务器发送数据(希望大约每秒30帧)。服务器收集每个玩家的数据,并设置新的状态(玩家鼠标位置)。 服务器有一个以每秒30帧的速度运行的定时器 – 向所有玩家的鼠标位置发送一条消息给所有玩家。 它使有效负载更大,但每秒只发送30个数据包 – 对于节点或现代浏览器来说没有问题。

祝你好运!

PS – 记住,你必须为速度devise!

考虑这样。

如果你真的想要build立一个实时更新的大型多人游戏,那么根据这里的统计数据 ,websockets是最好的select。 (socket.io是一个方便的库,提供了后备,但它应该被configuration为主要使用websockets。)

理查德做了一些可靠的估计 不过,还有两件事需要考虑:

  • 最大数量的开放连接(谷歌ulimit)
  • 并行化(node.js在单个线程上运行,这将在未来可能永远不会改变;当广播您的更改时,您的游戏是否可以接受大约O(n)的性能?)