7

您好我正在尝试使用 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 是一个全新的领域,我不知道的,所以我想问。

4

5 回答 5

5

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

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

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

下载带宽与播放器数量呈线性关系,因此在100 个播放器时,客户端的下载带宽更像 250kb/s,而服务器端的下载带宽则为 22Mb/s 。

如果您需要更多播放器,则需要进行优化,例如修剪消息、数据压缩、限制鼠标采样速度等。

于 2012-10-26T17:52:30.340 回答
3

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

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

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

于 2012-10-25T17:48:00.650 回答
1

以这种方式考虑。

如果你真的想构建一个具有实时更新的大型多人游戏,那么根据这里的统计数据,websockets 是你最好的选择。(socket.io 是一个提供回退的便利库,但它应该配置为主要使用 websockets。)

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

  • 最大打开连接数(google for ulimit)
  • 并行化(node.js 在单线程上运行,这在未来可能永远不会改变;在广播您的更改时,您的游戏可以接受大约 O(n) 的性能吗?)
于 2012-10-29T03:43:22.303 回答
1

虚拟形象真的会跟随鼠标移动,还是会移动到地图上被点击的位置?如果是后者,那么您只需将点击位置传输到服务器,服务器只需向客户端广播头像航点和行驶速度。

这在需要管理的对象和玩家数量方面仍然存在限制,但服务器可以为多个化身和对象收集 1/10 秒或 1/4 秒的操作,并将它们作为捆绑共享从而减少网络、服务器和客户端的负载。

于 2012-10-21T07:57:28.647 回答
1

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

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

祝你游戏好运!

PS——记住,你必须为速度而设计!

于 2012-10-28T03:07:15.783 回答