4

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

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

Client2 在:286470 收到数据 Client3 在:286479 Client4 收到数据在:286487 Client5 在:286520 收到数据

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

谢谢 Kishorevarma

4

2 回答 2

4

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

  1. 每艘玩家飞船所在的位置,以及关于该飞船的所有内容(面向方向、浮动方向、是否开启或关闭加速)
  2. 每颗子弹的位置(位置、方向、速度、是谁发射的)
  3. 每颗小行星所在的位置(位置、方向、速度)
  4. 每秒 30 次,运行物理,重绘屏幕

现在 ...

  1. 当客户端向您发出请求时(例如,将我的船向右旋转)- 客户端将该数据发送到服务器(并且不在本地处理)
  2. 当服务器收到用户请求时,它将请求排队等待下一个“tick”处理
  3. 服务器滴答声(每秒 30 次):处理所有排队的事件:
  4. 在请求旋转船舶时:实际旋转船舶。向所有人广播船舶数据(位置、朝向、速度……)
  5. 当客户端从服务器获得更新事件时,它会将来自服务器的新“正确”数据填充到其本地空间中。注意:如果客户端无法以 30 fps 处理所有内容,则在发送数据时,飞船将“跳”到正确的位置。
于 2012-10-16T16:58:34.720 回答
0

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

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

于 2013-03-21T11:19:42.633 回答