使用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 lightwheigt
, be 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)的性能?)