使用node.js / socket.io构建实时大型多人游戏有多贵?

时间:2012-10-19 12:07:48

标签: node.js websocket socket.io multiplayer

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

现在,在编码方面实现自身并不是一个问题,但是来自传统的http请求 - 响应Web编程模型,我不知道这在流量和服务器负载方面会有多昂贵。基本上在游戏过程中,玩家的浏览器应该跟踪实时鼠标输入事件并继续将它们广播到同一游戏中的所有其他玩家。

这是一个例子,假设我的化身跟随屏幕上的鼠标指针,它应该实时播放给屏幕上的其他玩家。我会做类似的事情:

// 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坐标)。如果这太贵了,无论这场比赛有多棒,我都不认为我能发货。谁能开导我?谢谢。

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

5 个答案:

答案 0 :(得分:5)

警告:下面的所有数字都是经过估算的,并且在好几个地方都有开销,但是应该给你一些起点。

如果你所做的只是在连接之间来回推送数据,那么服务器似乎不太可能成为你的瓶颈。我想你会用带宽打到你的第一面墙(在播放器端和/或数据中心端)。

假设每个用户平均每秒推动鼠标数据 25次,这意味着每个用户将下载玩家每秒25次。假设每个鼠标移动消息是100个字节并且 20个玩家意味着您(天真地)下载 ~50kb /秒,这是非常高但可实现的。我天真地说,因为会有间接费用,但是通过良好的连接,感觉是可以实现的。

下载带宽与播放器数量成线性关系,因此在 100个播放器时,它更像是客户端250kb / s和服务器端22Mb / s

如果您需要更多玩家,则需要找到优化,例如修剪消息,数据压缩,限制鼠标采样速度等。

答案 1 :(得分:3)

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

Leon的建议很好,只跟踪鼠标点击并且不跟踪鼠标移动。在这种游戏中,每个减少请求/响应的策略都是受欢迎的。

回答你的问题,我再次说,它是相对的,你的startegy(使用node.js和websockets)听起来不错,它可以同时为1.000用户工作,但不能用于1.000.000,但是,相同代码,具有更好的硬件,可以适用于1.000,1.000.000,1.000.000.000用户,这是一个基础设施问题。我认为预测是be carefully in your code to mantain the system lightwheigt,因为如果你知道你的代码是好的,那么问题就是硬件,带宽等等(你可以稍后再考虑这个问题。)

答案 2 :(得分:1)

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

在需要管理的对象和玩家数量方面仍有局限性,但服务器可以为多个头像和对象收集1/10秒或1/4秒的动作并将其分享出来作为捆绑,从而减少网络,服务器和客户端负载。

答案 3 :(得分:1)

我做了非常相似的事情......

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

祝你好运!

PS - 请记住,你必须设计速度!

答案 4 :(得分:1)

以这种方式考虑。

如果真的希望构建一个包含实时更新的大型多人游戏,那么根据这里的stats,如果你最好的话,那就是websockets。 (socket.io是一个方便的库,提供后备,但应配置为主要使用websockets。)

理查德做出了一些可靠的估计。但是,您还需要考虑另外两件事:

  • 最大打开连接数(google for ulimit)
  • 并行化(node.js在单个线程上运行,将来可能永远不会改变;在广播你的更改时,你的游戏可以接受大约O(n)的性能吗?)