我正在尝试使用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
答案 0 :(得分:4)
我创建了几个像这样的实时游戏。其中一个是多人小行星(每个人都在射击小行星,合作游戏)。 我有很好的响应时间 - 但是,我并没有“垃圾邮件”所有拥有太多数据的客户端 - 这可能是一个问题。我让游戏在客户端以60 fps运行,服务器以30 fps处理物理。 它只适用于所有客户端都是Chrome(因此他们有网络套接字)。今天大多数浏览器都支持Web套接字。 我会检查以确保你先插座。 其次,我不会向所有客户端发送太多数据:一种方法是以已知速率(如每秒30帧)处理服务器上的物理。此外,在客户端处理物理。将最终用户更改发送到30 fps边界上的所有客户端(而不是在获取数据时)。 对于小行星,这意味着: 每个客户端和服务器都知道以下内容:
现在......
答案 1 :(得分:0)
您可以查看我使用Node和Socket.io编写的在线多人游戏 - https://github.com/ecdeveloper/wallattack。代码非常简单。
还有一个演示版