使用Nodejs和Socket IO的多人游戏

时间:2012-08-10 16:59:52

标签: node.js socket.io multiplayer

我正在尝试使用Node和Socket IO的多玩家赛车游戏,快递。所以我尝试了一个简单的例子来查看节点服务器和客户端之间的延迟。  我在客户端有一个可拖动的图像。当我在一个客户端移动图像ienter代码时,它必须移动到所有客户端。 所以基本上当我移动图像时,我将图像位置以json格式发送到节点服务器,然后从那里我向所有客户端广播。从那时起,有大约300毫秒的延迟。以下是结果。

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

Client2收到的数据位于:286470 Client3收到的数据位于:286479 Client4收到的数据位于:286487 Client5收到的数据位于:286520

从client1移动到client5之间的延迟是384ms。它太高了赛车游戏.. 这是我的服务器代码。

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)有没有办法优化服务器代码以减少延迟?
2)这是使用节点和websockets的预期延迟吗? 3)socket io不能异步广播数据(我的意思是同时)?

由于 Kishorevarma

2 个答案:

答案 0 :(得分:4)

我创建了几个像这样的实时游戏。其中一个是多人小行星(每个人都在射击小行星,合作游戏)。 我有很好的响应时间 - 但是,我并没有“垃圾邮件”所有拥有太多数据的客户端 - 这可能是一个问题。我让游戏在客户端以60 fps运行,服务器以30 fps处理物理。 它只适用于所有客户端都是Chrome(因此他们有网络套接字)。今天大多数浏览器都支持Web套接字。 我会检查以确保你先插座。 其次,我不会向所有客户端发送太多数据:一种方法是以已知速率(如每秒30帧)处理服务器上的物理。此外,在客户端处理物理。将最终用户更改发送到30 fps边界上的所有客户端(而不是在获取数据时)。 对于小行星,这意味着: 每个客户端和服务器都知道以下内容:

  1. 每个玩家的船只,以及该船的一切(面向方向,浮动方向,如果提升是开启还是关闭)
  2. 每个子弹的位置(位置,方向,速度,发射者)
  3. 每个小行星都在(位置,方向,速度)
  4. 每秒30次,运行物理,重新绘制屏幕
  5. 现在......

    1. 当客户给你一个请求时(比如,把我的船转到 右) - 客户端将该数据发送到服务器(并没有 在本地处理它)
    2. 当服务器收到用户请求时,它会将请求排队 处理下一个“tick”
    3. 服务器节拍(每秒30次):处理所有排队的事件:
    4. 关于旋转船舶的请求:实际上旋转船舶。广播 船舶数据给每个人(位置,面向方向,速度......)
    5. 当客户端从服务器获取更新事件时,它会对此产生新的影响 从服务器“更正”数据到其本地空间。 注意:如果客户端无法以30 fps处理所有内容,则在发送数据时,船只将“跳转”到正确的位置。

答案 1 :(得分:0)

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

http://wallattack.ecdeveloper.com/

还有一个演示版