我正在尝试使用Node和Socket IO,express的多人赛车游戏。因此,我尝试了一个简单的示例来查看节点服务器和客户端之间的延迟。我在客户端有一个可拖动的图像。当我将图像输入代码移入一个客户端时,它必须移动到所有客户端。因此,基本上当我移动图像时,我将图像位置以json格式发送到节点服务器,然后从那里向所有客户端广播。从这个时间开始,大约有300ms的延迟。以下是结果。
客户端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)使用node和websockets是否达到了预期的延迟?
3) socket io不能异步广播数据(我的意思是同时广播)吗?
感谢Kishorevarma
发布于 2012-10-17 00:58:35
我已经创建了几个像这样的实时游戏。一种是多人小行星(每个人都在向小行星射击,合作游戏)。我有很好的响应时间--但是,我没有向所有客户端发送太多数据的“垃圾邮件”--这可能是一个问题。我让游戏在客户端以60fps的速度运行,而服务器以30fps的速度处理物理效果。只有当所有的客户端都是Chrome时,它才能工作(所以他们有web-socket)。目前大多数浏览器都支持web套接字。我会先检查一下你有没有插座。其次,我不会向所有客户端发送太多数据:一种方法是在服务器上以已知的速率(如每秒30帧)处理物理数据。此外,还要在客户端处理物理过程。将最终用户更改发送到30 fps边界上的所有客户端(而不是在获得数据时)。对于小行星,这意味着:每个客户端和服务器都知道以下内容:
<代码>G29
现在..。。
当客户端给你一个请求时(比如,将我的船向右旋转) --客户端将数据发送到服务器(并且不对其进行处理)服务器得到一个用户请求,它将该请求排队等待处理下一次“locally)
the ship.将船舶数据广播给每个人(位置、朝向、速度...)
发布于 2013-03-21 19:19:43
你可以看看我的在线多人游戏,用Node和Socket.io - https://github.com/ecdeveloper/wallattack写的。代码非常简单。
在http://wallattack.ecdeveloper.com/上也有一个演示
https://stackoverflow.com/questions/11906145
复制相似问题