Mam dwa liczniki czasu odliczania kodu JavaScript (dla gry) i tabelę MySQL do odbierania danych z wywołań AJAX z jednego z nich.Synchronizuj dwa liczniki JavaScript po stronie klienta z serwerem
Proces jest następujący:
klient uruchamia timer, pisze to
data1
kolumna MySQL tak, że zaczęło timer oraz kolumnętime1
z aktualnym datownik (z .01s precyzją od wezwania PHP MySQL nie jak robi to)innego klienta (odpytywania serwera co 2 sekundy) wykrywa zmianę i rozpoczyna odliczanie czasu, ale od razu odejmuje (jest to odliczanie)
ctime - time1
gdziectime
jest sygnaturą czasową drugiego połączenia klientów (również podaną przez PHP) itime1
jest znacznikiem czasu, który napisał pierwszy klient po uruchomieniu stopera.
Metoda ta ma na celu wyeliminowanie opóźnień spowodowanych przez 2s odstępach czasu odpytywania, ale niezależnie od tego, czy to robi lub nie (nie jestem pewien, szczerze mówiąc), synchronizacja między zegarów zmienia . Czasem są martwe, czasami wyłączone nawet o 3 sekundy. (To niewiarygodne.)
Oto niektóre z moich odpowiedniego kodu używam:
var timerRunning, timeRemaining, responseTime;
function restartLocalTimer() {
var d = new Date();
responseTime = d.getTime()/1000;
timerRunning = true;
timerTick();
}
function restartSyncTimer(resp) { // resp is the AJAX response passed
var d = new Date();
responseTime = d.getTime()/1000 - parseFloat(resp["ctime"]) + parseFloat(resp["time"]);
timerRunning = true;
timerTick();
}
function timerTick() {
d = new Date();
timeRemaining = 20 - d.getTime()/1000 + responseTime;
if (timerRunning) setTimeout("timerTick()",25);
}
Wszystkie wartości czasowe są w sekundach. (Ze względu na to, że baza danych może się zmienić na ms później.)
Moje pytania: Czy są jakieś dodatkowe (znaczne) opóźnienia, których nie uwzględniam? Czy jest lepszy sposób na zrobienie tego?
Uwaga: Jestem otwarty na jQuery (używając go już do wywołań AJAX), ale nie chcę używać websockets.
Ok, więc tym razem przeczytałem. Po pierwsze: po co używać 'setTimeout (" timerTick() ", 25)'? Dlaczego nie "setTimeout (timerTick, 25)". Pierwszy argument 'setTimeout' przyjmuje uchwyt funkcji. Po drugie: jeśli skorzystasz na przykład ze strony Osi czasu lub strony przeglądarki Google Chrome w konsoli, czy pomoże ci to określić przyczynę opóźnienia lub czy już to wypróbowałeś? –
dobra, pierwsza rzecz to w zasadzie tylko estetyka, ale dzięki i tak. co do osi czasu, zamierzam bardziej w to zaglądać. –
'resp [" czas "]' to znacznik czasu, na który liczysz? – Bergi