在2个JS应用之间同步事件

时间:2018-12-02 16:27:34

标签: javascript typescript websocket

我有一个游戏应用程序(电子)和一个网络应用程序(在android chrome上测试)。通过websocket服务器传递消息。我想协调两个进程之间的倒计时。它不一定是完美的,但是我观察到的是,如果我在低延迟的环境中运行,那就很好了。但是,它们在系统中的滞后性似乎比Electron应用程序要早于Web应用程序。我已经测试了所有的数学运算,它应该可以同步,但事实并非如此。

首先,网络应用通过将开始时间传递给游戏应用来启动倒计时的开始

const timeToGameStart:number = peerConnection.timeToGameStart(); // time to game start = 3 x (the longest time it toke to pass a previous msg from game app to web app) 
const currUnixTime:number = peerConnection.currUnixTime();
const startGameTime:number = currUnixTime + timeToGameStart;
const startGame:StartGame = <StartGame>{
    msg_data_type:Msg_Data_Type.StartGame,
    game_start_time:startGameTime
}
peerConnection.passMsg(startGame);
setTimeout(timer.start, timeToGameStart);

下面是代码的应用程序部分,用于响应传递给服务器的味精

const gameStartTime:number = (<StartGame> msgData).game_start_time;
const currUnixTime:number = ServerConnection.currUnixTime();

// if we are on time, wait till its right time else if we are late, start at the next inc 3,2,1
const countDownLength:number = 3;
if (currUnixTime <= gameStartTime) {
    setTimeout(()=>startCountDown(countDownLength), currUnixTime - gameStartTime);
} else {
    const timeWeAreLateBy:number = currUnixTime - gameStartTime;
    const timeWeAreLateByInSec:number = Math.ceil(timeWeAreLateBy / 1000);
    const shortCountDownLen:number = Math.max(countDownLength - timeWeAreLateByInSec, 0);
    const timeToNextSec:number = Math.max((1000 * timeWeAreLateByInSec) - timeWeAreLateBy, 0);

    setTimeout(()=>startCountDown(shortCountDownLen), timeToNextSec);
}

1 个答案:

答案 0 :(得分:0)

问题在于这两个单独的进程在单独的OS上。两者都有不同的时间定义。即(new Date()).getTime()返回不同的数字。差异为2秒,因此控制器认为连接没有延迟,并告诉应用程序尽快启动。

解决方案是我必须定义一致的时间度量。每个应用程序连接到服务器后,它们都会通过请求服务器的时间来与服务器同步时间。

我不需要超精确的时间同步,因此我使用了一个简单的算法即可完成工作。该算法正在尝试计算进程离开服务器的时间差。我使用的公式是server_time_diff = server_time - (received_time - RTT/2)。现在要统一(或服务器时间),您只需致电new Date() + server_time_diff。 RTT是从服务器请求时间所花费的时间。

欢迎对我的算法进行任何改进。