【问题标题】:Socket.io/nodejs problems with emitSocket.io/nodejs 的发射问题
【发布时间】:2019-08-11 03:02:40
【问题描述】:

我目前正在开发一个小型测试游戏,并注意到套接字发射发送的信息存在巨大延迟。 上下文是o有一个可以射击的玩家,每次他射击时,他都会向服务器发送带有子弹信息的发射,服务器会向其他玩家广播。 我的问题是,玩家发送大量发射的这种工作流程是否会减慢 socket.io 的执行速度。 我注意到的另一件事是,有时套接字发射中的 console.log 在一段时间内不会出现在控制台中(如果这两件事有相同的原因,idk)

Client emiting..
shoot(){
  socket.emit('newBullet', bullet.position, bullet.direction,bullet.damage);
}

Server receiving emits..
socket.on('newBullet', function(position, direction, damage){
      socket.broadcast.emit('spawnBullet', position, direction, damage);
});

Other clients receiving broadcast..
socket.on('spawnBullet', function(position, direction, damage){
      const b = new bullet(position, direction, damage);
      player.bullets.push(b);
});

【问题讨论】:

  • 如果没有看到代码的相关部分,人们不太可能提供帮助。有关您的代码问题的问题应包括直接插入问题中并正确格式化为代码的代码的相关部分。
  • 对不起,我用伪代码编辑了问题

标签: node.js sockets socket.io


【解决方案1】:

我的问题是,玩家发送大量发射的这种工作流程是否会减慢 socket.io 的执行速度。

是的,可以。

这完全取决于您的服务器是否跟得上以及客户端是否跟得上。对于给定的服务器,肯定存在来自所有客户端的消息速率,这些消息将难以跟上并执行它应该做的任何其他事情。

同样,如果许多客户端都向服务器发送消息,导致它向所有其他客户端广播,那么很快就会有大量消息供服务器发送和客户端处理。

存在一些智能设计,可以检测更新速率何时过快,并采取一些措施来缓解这种情况(可能会跳过队列中已经被其他消息取代的消息)。想象一下与鼠标驱动程序相同的概念,它试图显示鼠标在屏幕上的每个像素处移动,但如果你移动它的速度足够快,它会跳过中间的鼠标渲染,只显示渲染鼠标时的最新位置。当有太多更新飞来飞去时,您可能想要做类似的事情。

我注意到的另一件事是,有时套接字发射中的 console.log 在一段时间内不会出现在控制台中(如果这两件事有相同的原因,idk)

这听起来像是滞后。服务器或客户端都不堪重负,数据输入的速度超出了它的处理速度。

【讨论】:

  • 感谢您的回复,我认为这种逻辑在将玩家的位置发送给其他人时非常有用。但是我想不出一种将这种逻辑应用于子弹的方式,因为当一个玩家射击时,必须将这些信息发送给所有人,对吗?
  • @Gobbs - 如何跳过或合并消息是非常特定于应用程序的。这完全取决于服务器队列中有哪些不必要或冗余的信息等待发送到客户端,这些信息可以被消除或可以将多条消息合并为一条摘要消息,从而减少流量。也可能是您的客户端或服务器需要提高计算效率,以便处理更多消息。
猜你喜欢
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2021-05-09
  • 2018-05-07
  • 2020-06-29
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
相关资源
最近更新 更多