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

时间:2016-04-29 02:25:59

标签: node.js performance io socket.io processing-efficiency

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

  1. 发送包含数据的环境数组,该数组将替换每个客户端上的本地数组。
  2. 当对象在播放器视野中出现/消失时发送单个消息,并逐个修改本地数组对象。
  3. 如果有比上述两种更好的方法,请勾勒出来。

1 个答案:

答案 0 :(得分:1)

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

首先,要缩放和缩短延迟,您需要:

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

    1. 将客户端发送更新的地图范围缩小到只有近距离观看的内容(听起来你已经在做了一些)。
    2. 在您要发送给客户端的每封邮件中尽可能多地合并信息 - 确保您永远不会向特定客户端发送多条消息以进行特定更新。
    3. 向您要发送的每个客户端发送较小的消息:

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

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