首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Nodejs和Socket IO的多人游戏

使用Nodejs和Socket IO的多人游戏
EN

Stack Overflow用户
提问于 2012-08-11 00:59:52
回答 2查看 4.3K关注 0票数 4

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

客户端1正在向服务器发送数据,时间为: 286136 (时间戳)服务器接收时间为: 286271

Client2接收数据时间: 286470 Client3接收数据时间: 286479 Client4接收数据时间: 286487 Client5接收数据时间: 286520

从client1移动到client5之间的延迟为384ms。这对于赛车游戏来说太高了..这是我的服务器代码。

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-17 00:58:35

我已经创建了几个像这样的实时游戏。一种是多人小行星(每个人都在向小行星射击,合作游戏)。我有很好的响应时间--但是,我没有向所有客户端发送太多数据的“垃圾邮件”--这可能是一个问题。我让游戏在客户端以60fps的速度运行,而服务器以30fps的速度处理物理效果。只有当所有的客户端都是Chrome时,它才能工作(所以他们有web-socket)。目前大多数浏览器都支持web套接字。我会先检查一下你有没有插座。其次,我不会向所有客户端发送太多数据:一种方法是在服务器上以已知的速率(如每秒30帧)处理物理数据。此外,还要在客户端处理物理过程。将最终用户更改发送到30 fps边界上的所有客户端(而不是在获得数据时)。对于小行星,这意味着:每个客户端和服务器都知道以下内容:

  1. 每个玩家飞船所在的位置,以及有关该飞船的所有信息(面向方向,浮动方向,如果boost打开或关闭)
  2. 每个子弹所在的位置(位置,方向,速度,发射它的人)
  3. 每个小行星所在的位置(位置,方向,速度)
  4. 每秒30次,运行物理操作,重新绘制屏幕

<代码>G29

现在..。。

当客户端给你一个请求时(比如,将我的船向右旋转) --客户端将数据发送到服务器(并且不对其进行处理)服务器得到一个用户请求,它将该请求排队等待处理下一次“locally)

  • When”
  1. server tick (每秒30次):处理所有排队的事件:
  2. On a request to rotate a ship:

the ship.将船舶数据广播给每个人(位置、朝向、速度...)

  1. 当客户端从服务器获取更新事件时,它会将来自服务器的新“正确”数据塞进它的本地空间。注意:如果客户端不能以每秒30帧的速度处理所有数据,那么在发送数据时,船舶将“跳转”到正确的位置。
票数 4
EN

Stack Overflow用户

发布于 2013-03-21 19:19:43

你可以看看我的在线多人游戏,用Node和Socket.io - https://github.com/ecdeveloper/wallattack写的。代码非常简单。

http://wallattack.ecdeveloper.com/上也有一个演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11906145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档