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

Vla*_*lad 7 multiplayer websocket node.js socket.io

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

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

这是一个例子,假设我的化身跟随我的鼠标指针在屏幕上,它应该实时广播到屏幕上的其余玩家.我会做的事情如下:

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

并在服务器上:

// 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});
        });
    });
    ...
});
Run Code Online (Sandbox Code Playgroud)

我认为这应该有效,但这需要浏览器每秒向服务器发送几个事件,随后应该将它们广播给同一游戏中的其余玩家,我担心这个含义.但有一件事是传输的每个数据片段的大小并不大(基本上它只是一个x和y坐标).如果这太贵了,无论这场比赛有多棒,我都不认为我能发货.谁能开导我?谢谢.

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

Ric*_*arr 5

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

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

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

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

如果您需要更多播放器,您需要找到优化,例如修剪消息,数据压缩,限制鼠标采样速度等.