Socket.IO:使用大量波动数据更新客户端的最有效方法

Socket.IO: most efficient way to update clients with massively fluctuating data

想象一下 Agar.io。与聊天应用程序不同,随着玩家在地图上移动,用户(或玩家)列表和其他环境对象将不断变化,对于每个玩家来说。那是因为每个客户端无法接收到关于每个对象的更新,因为地图太大而且滞后太多。那么以下哪种使用 Socket.IO 更新客户端的方法会更有效:

  1. 发送包含数据的环境数组,替换每个客户端上的本地数组。
  2. 当对象 appear/disappear 在玩家视野中时发送单独的消息,并逐个对象修改本地数组。

如果有比以上两种更好的方法,请大声指出。

这是一个多向量权衡决策,因此如果没有一些测量和可能的实验,我们无法真正告诉您什么情况是最佳的。但是,我们可以引导您的想法,您可以希望用它来完成分析。

首先,要扩展和减少延迟,您需要:

  1. 向每个客户端发送更少的消息。
  2. 在每条消息中发送较小的负载,只要它不会使第 1 项变得更糟(例如,只要它不会导致您发送更多消息)。
  3. 减少在服务器上进行计算然后发送消息的次数。

要向您想要的每个客户端发送更少的消息:

  1. 将客户端收到的更新发送的地图范围缩小到仅近距离观察的事物(听起来您已经在做一些了)。
  2. 在您要发送给客户端的每条消息中尽可能多地合并信息 - 确保您不会针对特定更新向给定客户端发送多条消息。

要向您想要的每个客户端发送更小的消息:

  1. 减少发送给每个客户端的数据大小。这意味着如果自从您上次与此客户端通信以来某些数据没有更改,则不要重新发送该数据。这表明您的第二个选项(客户端更新其自己的本地数组)是更好的方法,因为您只需将增量发送到客户端并且它会记住以前的状态。

  2. 仔细分析您发送给客户端的数据格式,并尽可能减小其大小。如果您正在尝试优化传输大小,直接 JSON 通常不是发送数据的最有效方式。