Javascript 如何在在线游戏中同步客户端之间的时间

Javascript 如何在在线游戏中同步客户端之间的时间,javascript,node.js,websocket,synchronization,client-server,Javascript,Node.js,Websocket,Synchronization,Client Server,我正在NodeJS制作一个在线多人游戏,玩家必须尽可能快地猜出谜题的正确答案。游戏通过多轮进行,每轮1分钟(类似于)。每轮之间有10秒的暂停,记分牌显示在暂停处。如果每个玩家在时间结束前都找到了答案,那么这轮比赛将立即结束 当玩家的客户端获取游戏时,服务器会根据游戏开始的时间和服务器的时间发送到当前回合剩余的时间。每个玩家的客户端都有一个本地计时器,用于轮次和轮次之间的10秒暂停。使用服务器发送的剩余时间初始化客户端计时器。当一个玩家的计时器启动时,或者当websocket通知说回合已经结束时,

我正在NodeJS制作一个在线多人游戏,玩家必须尽可能快地猜出谜题的正确答案。游戏通过多轮进行,每轮1分钟(类似于)。每轮之间有10秒的暂停,记分牌显示在暂停处。如果每个玩家在时间结束前都找到了答案,那么这轮比赛将立即结束

当玩家的客户端获取游戏时,服务器会根据游戏开始的时间和服务器的时间发送到当前回合剩余的时间。每个玩家的客户端都有一个本地计时器,用于轮次和轮次之间的10秒暂停。使用服务器发送的剩余时间初始化客户端计时器。当一个玩家的计时器启动时,或者当websocket通知说回合已经结束时,客户端显示回合已经结束

第一轮游戏开始时,游戏制作人点击按钮,告诉服务器创建新一轮游戏和拼图。然后,服务器向该游戏的玩家发送一个websocket通知,告知一轮游戏已经开始

我的问题是:对每个球员来说,回合必须同时开始和结束。在第一轮之后,必须为下一轮创建一个拼图,因此服务器必须知道它应该使用一个拼图创建新一轮,并通过websocket告诉玩家新一轮已经开始。因为我最终可以在多个服务器上部署我的游戏(集群化),我希望我的服务器是无状态的,所以我不希望后端为正在玩的每一个游戏保留计时器

你对如何解决这个问题有什么想法吗


谢谢,

我怀疑,如果没有服务器作为维护游戏状态的真相来源,是否有任何方法可以实现这一点,但也许有人会从您那里得到一种方法;我期待着阅读这里发布的答案。@gonzalo-这是一个有趣的想法,我还认为您已经发现了我认为的任何无状态服务器方法的主要问题-您可以尝试使用用户的时钟,但一旦你这么做了,你就有可能让用户开始用他们传输给游戏系统的数据进行模拟。如果这是一个可接受的风险,那么像这样的方法是可以接受的。另一种方法是使用共享内存服务器,所有服务器都可以共享轮次。通过这种方式,您不需要在服务器中存储任何信息,只要服务器需要信息,就会请求将其发送到共享内存服务器。(我想到的是redis服务器)@gonzalo嗨,gonzalo,很抱歉耽搁了!我认为它必须像你说的那样工作。现在,游戏的领导者是游戏的创造者。但是,正如你所指出的,这个人现在控制着游戏的流程。如果他们退出游戏或者失去联系或者其他什么,那么就不会有下一轮了。如果他们决定欺骗系统并提前开始一轮,那么其他玩家的回合将被缩短。我认为对于无状态后端来说,“leader”方法是正确的,但这意味着需要设置一些机制才能使其工作。例如,心跳系统,其中客户端将其连接状态发送到后端。我不确定共享内存服务器,因为后端仍然需要触发计时器上的循环创建。