Meteor 跨用户同步倒计时

Synchronous countdown across users on Meteor

我正在开发一款多人游戏(用于科学实验),参与者可以参与 20 轮互动决策。每轮有 3 个阶段,每个阶段最多应持续 30 秒。我想知道什么是实现倒计时的好方法。

目前,我正在使用客户端方法。在创建回合模板时,我使用客户端计时器,当它达到 0 时提交参与者的答案。到目前为止这工作正常(因为每个人都在同一时间开始游戏,下一轮仅在每个人都提交了答案)。考虑到参与者可能会断开连接(离线、关闭浏览器、出现连接问题)并可能操纵会话或其他问题,我不确定这是一个好方法。

做服务器端计时器会是更好的方法吗?例如,一个包含计时器的集合,参与者订阅该集合?如果是这样,如何实现服务器端倒计时?另外,考虑到倒计时中的每一秒(我们在模板中显示)都需要在服务器上侦听数据,这种方法是否会对服务器造成高要求?

永远不要相信客户。

考虑到这一点,我们需要找到一种方法让客户端根据服务器选择的时间显示剩余时间...首先,服务器将回合结束时间设置为创建(或开始时间 + 持续时间)。

现在每个人都有相同的结束时间,这是根据服务器确定的,我们需要将他们与服务器时间同步。让我们使用 mizzao:timesync 它非常简单,它接收服务器时间,并创建与客户端时间的差异。监控客户端时间以确保没有奇怪的时钟变化发生,甚至考虑延迟。这可能比您需要的要多一些,但它已经完成了,所以对我们来说工作更少了!

现在我们知道了当前的服务器时间和回合结束时间,我们可以很容易地显示剩余时间!如果玩家在断开连接或刷新后回来,这两个时间仍然有效,他们将能够继续游戏。