使用Nodejs和Socket IO的多玩家游戏

我正在尝试使用Node和Socket IO的多人赛车游戏,expression。 所以我试过简单的例子来看看节点服务器和客户端之间的延迟。 我在客户端有一个可拖动的图像。 当我移动图像引擎代码heren一个客户端,它必须在所有的客户端。 所以基本上当我移动的图像我发送的图像位置的节点服务器的JSON格式,然后从那里我广播给所有客户端。 有一个约300毫秒的时间延迟。 以下是结果。

客户端1发送数据到服务器:286136(时间戳)服务器收到:286271

客户端2收到的数据位于:286470客户端3收到的数据位于:286479客户端4收到的数据位于:286487客户端5收到的数据位于:286520

从客户端1到客户端5之间的延迟时间为384毫秒。 它太高的赛车游戏..这里是我的服务器代码。

var app = require('express').createServer(); var io = require('socket.io'); var http = require('http'); var http_server = http.createServer(); var server = http.createServer(app); server.listen(3000); var socket = io.listen(server,{ log: false }); socket.sockets.on('connection', function (client) { client.on('message', function (data){ console.log("data arrived to server",new Date().getTime()); // Below both statements are giving same latency between the client 1 and client 5 client.broadcast.emit('message',data); //socket.sockets.emit('message',data); }); }); 

1)有什么办法来优化服务器代码来减less延迟?
2)是否使用节点和websockets预期延迟?
3)套接字io不能asynchronous地(我的意思是同时)广播数据?

谢谢Kishorevarma

我创build了一个这样的几个实时游戏。 一个是多人游戏小行星(每个人都在小行星,合作玩)射击。 我有很好的响应时间 – 但是,我不是“垃圾邮件”数据太多的所有客户 – 这可能是一个问题。 我以每秒30帧的速度在客户端以60 fps的速度运行游戏。 它只有当所有的客户端都是铬(所以他们有networking套接字)。 目前大多数浏览器都支持Web套接字。 我会检查,确保你有第一个sockets。 其次,我不会把太多的数据发送给所有客户端:一种方法是以已知的速率(例如每秒30帧)在服务器上处理物理。 另外,正在处理客户端上的物理。 将最终用户更改发送到30 fps边界上的所有客户端(而不是在获取数据时)。 对于小行星来说,这意味着:每个客户端和服务器都知道以下内容:

  1. 凡是每艘运动员的船只,以及该船舶的一切(面向方向,浮动方向,如果启动或closures)
  2. 每一颗子弹(地点,方向,速度,谁发射它)
  3. 凡小行星(地点,方向,速度)
  4. 每秒30次,运行物理,重画屏幕

现在…

  1. 当一个客户给你一个请求时(比如,把我的船旋转到右边) – 客户把这些数据发送给服务器(而不是在本地处理)
  2. 当服务器获得用户请求时,它将请求排队等待下一个“打勾”
  3. 服务器打勾(每秒30次):处理所有排队的事件:
  4. 在旋转船的要求:实际上旋转船。 将船舶数据广播给每个人(位置,朝向,速度…)
  5. 当客户端从服务器获取更新事件时,会将来自服务器的新“正确”数据压缩到本地空间中。 注意:如果客户端无法以30fps的速度处理所有数据,那么当数据发送时,船只将会“跳转”到正确的位置。

你可以检查我的在线多人游戏,使用Node和Socket.io – https://github.com/ecdeveloper/wallattack编写。 代码非常简单。

还有一个演示可在http://wallattack.ecdeveloper.com/