Синхронизация событий между двумя приложениями JS - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть игровое приложение (Electron) и веб-приложение (тестирование на Android Chrome).Это передать сообщения через сервер веб-сокета.Я хочу скоординировать обратный отсчет между двумя процессами.Это не обязательно должно быть идеально, но я заметил, что если я работаю в среде с низкой задержкой, это нормально.Но чем больше их отставание в системе, тем больше кажется, что приложение Electron пытается запуститься гораздо раньше, чем веб-приложение.Я проверил всю свою математику, и она должна синхронизироваться, но это не так.

Сначала веб-приложение инициирует начало обратного отсчета, передавая время запуска игровому приложению

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 голосов
/ 07 декабря 2018

Проблема в том, что эти два отдельных процесса находятся в разных ОС.Которые оба имеют разное определение времени.т.е. (new Date()).getTime() вернуть разные числа.разница составляла 2 секунды, поэтому диспетчер решил, что соединение не задерживается, и велел приложению запустить как можно скорее.

Решение было в том, что я должен был определить непротиворечивое измерение времени.После того, как каждое приложение подключается к серверу, они синхронизируют свое время с сервером, отправляя запрос на время, которое есть на сервере.

Мне не нужна супер точная синхронизация времени, поэтому я использовал простой алгоритм, который сделал свою работу.Алгоритм пытался вычислить разницу во времени, когда процесс был отключен от сервера.Формула, которую я использовал, была server_time_diff = server_time - (received_time - RTT/2).Теперь, чтобы получить унифицированное (или серверное время), вам просто нужно позвонить new Date() + server_time_diff.RTT - это время, которое потребовалось для запроса времени с сервера.

Любые идеи по улучшению моего алгоритма приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...