我有一个游戏应用程序(电子)和一个网络应用程序(在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);
}
答案 0 :(得分:0)
问题在于这两个单独的进程在单独的OS上。两者都有不同的时间定义。即(new Date()).getTime()
返回不同的数字。差异为2秒,因此控制器认为连接没有延迟,并告诉应用程序尽快启动。
解决方案是我必须定义一致的时间度量。每个应用程序连接到服务器后,它们都会通过请求服务器的时间来与服务器同步时间。
我不需要超精确的时间同步,因此我使用了一个简单的算法即可完成工作。该算法正在尝试计算进程离开服务器的时间差。我使用的公式是server_time_diff = server_time - (received_time - RTT/2)
。现在要统一(或服务器时间),您只需致电new Date() + server_time_diff
。 RTT是从服务器请求时间所花费的时间。
欢迎对我的算法进行任何改进。