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

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

Client2收到的数据为:286470
Client3收到的数据为:286479
Client4收到的数据为:286487
Client5在以下位置接收到数据: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)有什么方法可以优化服务器代码以减少延迟?
2)这是使用 Node 和websockets的预期延迟吗?
3)socket io不能异步广播数据(我是说同时)吗?

谢谢
Kishorevarma

最佳答案

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

  • 每个玩家船所在的位置以及该船的所有内容(面向方向,漂浮方向,如果启用或禁用增强功能)
  • 每个子弹在哪里(位置,方向,速度,发射者)
  • 每个小行星所在的位置(位置,方向,速度)
  • 每秒30次,运行物理,重新绘制屏幕

  • 现在 ...
  • 当客户提出要求时(例如,将我的船转至
    正确)-客户端将该数据发送到服务器(并且不会
    在本地处理)
  • 当服务器收到用户请求时,它将请求排队等待
    处理下一个“刻度”
  • 服务器滴答声(每秒30次):处理所有排队的事件:
  • 根据请求旋转船:实际旋转船。播送
    所有人的船只数据(位置,朝向,速度...)
  • 当客户端从服务器获取更新事件时,它会填充新的
    将服务器中的数据“正确”到本地空间。
    注意:如果客户端无法以30 fps的速度处理所有内容,则发送数据时,飞船将“跳到”其正确的位置。
  • 10-06 10:17
    查看更多