检测阵列变化的最佳方法是什么



我每30秒打一次电话给游戏服务器,得到的响应是:

{ 
name: 'test',
map: 'pool',
maxplayers: 12,
players:
[ { deaths: 0,
kills: '0',
ping: 50,
name: 'test',
score: 0
} ],
}

我怎么能console.log这样的东西:"${name}加入了一个服务器!"然后上次调用的数组更改为这个,例如:

players:
[ { deaths: 0,
kills: '0',
ping: 50,
name: 'test',
score: 0
},
{ deaths: 0,
kills: '0',
ping: 20,
name: 'test2',
score: 0
}
]

我在考虑使用数据库并保存对它的响应,然后与最近调用的新数组进行比较,但我觉得应该有更好的方法

编辑

我没有解释我的自我更正,我正在使用"gamedig"npm模块从战场游戏服务器获取统计数据,我无法访问实际的服务器,我只知道ip。

有很多方法可以处理这一问题,但作为一个起点,我建议不要每30秒轮询一次服务器,如果可以的话,请改用更基于事件的系统。轮询本身并不是邪恶的,但它确实可能会长期遇到扩展问题,以及代码维护问题,比如你所描述的问题。

首先,如果你想确保你的客户端不会在游戏进行到一半时突然无法同步,你肯定需要某种数据库来存储游戏的状态。否则,任何导致服务器端代码重新启动的错误或崩溃都会清除游戏状态,你就倒霉了。你可以从几种中选择任何一种,但我会从Redis或Firebase开始,这取决于你有/想要什么样的服务器。

其次,如果双方都发出事件(例如使用socket.io(,让客户端知道全局游戏状态何时发生了变化,并将这些事件存储在时间同步日志中,则可以更容易地重建未接来电等。这样,如果客户端在一段时间内没有收到更新(出于这个原因,一些游戏会保持服务器的心跳(,它可以明确询问服务器错过了什么,并获取自上次已知更新以来发生的一组事件。最后一点意味着你发送的每一条消息都包括一个时间戳,表明它何时有效,所以你可以忽略上次更新之前发生的事情。唯一事件ID对于跟踪已处理或未处理的事件也非常有用。

编辑

好吧,考虑到您没有服务器端可供使用,您的选择真的很有限。我认为最好的方法是转换数据,这样你就可以更容易地检测到更改,比如基于用户名的哈希:

const users = {
'user1': { deaths: 0, kills: 0, score: 0 }
'user2': { deaths: 1, kills: 5, score: 3000 }
}

然后,对于来自服务器的每个响应,您只需要检查阵列中每个用户的存在:

// serverUsers is whatever collection of users you get back in your poll    
const newUsers = serverUsers.filter(u => Object.keys(users).includes(u.name));

显然,检测玩家离线是类似的,只是朝着相反的方向进行,你会看到谁在"users"集合中,而不是在"serverUsers"集合中。

相关内容

最新更新