使用Nodejs和Socket IO创建多人游戏

4
我正在使用Node和Socket IO,express尝试多人竞速游戏。因此,我尝试了一个简单的例子,以查看节点服务器和客户端之间的延迟。 我在客户端有一个可拖动的图像。当我在一个客户端移动图像时,所有客户端上的图像都必须移动。 因此,当我移动图像时,我以JSON格式将图像位置发送到节点服务器,然后从那里广播到所有客户端。从时间上看,大约需要300ms延迟。以下是结果。
客户端1将数据发送到服务器的时间戳为:286136 服务器接收到的时间戳为:286271
客户端2收到数据的时间戳为:286470 客户端3收到数据的时间戳为:286479 客户端4收到数据的时间戳为:286487 客户端5收到数据的时间戳为:286520
从客户端1到客户端5移动的延迟为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


为什么不使用Reddwarfserver.org来完成呢? - felipe
1
你使用的是哪个浏览器?这可能是因为你使用的浏览器不支持Websockets。这会增加大量延迟。另外,我猜想你没有在本地运行服务器。你应该定期对服务器进行ping测试,看看多少延迟是纯网络延迟。 - travis
2个回答

4
我曾经创建了几个类似于这样的实时游戏。 其中一个是多人游戏《Asteroids》(每个人都在射击小行星,合作游戏)。 我有很好的响应时间 - 但是我没有向所有客户端“发送”太多数据 - 这可能是一个问题。 我让游戏在服务器以30 fps的速度处理物理,在客户端以60 fps的速度运行。 当且仅当所有客户端都是Chrome浏览器(因此它们具有Web套接字)时,才能正常工作。 现在大多数浏览器都支持Web套接字。 我建议检查您是否首先拥有套接字。 第二,不要向所有客户端发送太多数据:一种方法是在服务器上以已知速率(例如每秒30帧)处理物理。同时在客户端处理物理。 在30帧每秒边界(而非数据到达时)将最终用户更改发送给所有客户端。 对于小行星来说,这意味着:每个客户端和服务器都知道以下内容:
1. 每艘玩家飞船的位置以及与该飞船相关的所有信息(面向方向、浮动方向,加速是否打开等) 2. 每个子弹的位置,方向,速度和发射者 3. 每颗小行星的位置,方向和速度 4. 30次每秒运行物理,重绘屏幕
现在...
1. 当客户端给您发出请求(例如,将我的飞船旋转到右侧)时 - 客户端将该数据发送到服务器(并不在本地处理) 2. 当服务器收到用户请求时,将请求排队等待下一个“tick”进行处理 3. 服务器tick(每秒30次):处理所有排队事件: 4. 对于旋转飞船的请求:实际旋转飞船。将飞船数据广播给每个人(位置、面向方向、速度...) 5. 当客户端从服务器接收到更新事件时,它会将服务器的新的“正确”数据压缩到其本地空间中。注意:如果客户端无法以每秒30帧的速度处理所有内容,则当数据被发送时,飞船将“跳”到正确的位置。

出于好奇,为什么服务器只有30tps?您尝试过更高的速率,但遇到了问题吗? - Gershom Maes
我认为对于这样的游戏,每秒30帧已经足够了。来自服务器的信息可以纠正客户端上的数据——仍然可以在屏幕上提供流畅的体验。 - DanBaker

-1

两个链接都失效或者被停用了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接