我正在尝试使用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 fps的速度处理所有内容,则发送数据时,飞船将“跳到”其正确的位置。