2013-03-05 15 views
7

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:

  1. 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)

  2. innego klienta (odpytywania serwera co 2 sekundy) wykrywa zmianę i rozpoczyna odliczanie czasu, ale od razu odejmuje (jest to odliczanie) ctime - time1 gdzie ctime jest sygnaturą czasową drugiego połączenia klientów (również podaną przez PHP) i time1 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.

+1

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ś? –

+0

dobra, pierwsza rzecz to w zasadzie tylko estetyka, ale dzięki i tak. co do osi czasu, zamierzam bardziej w to zaglądać. –

+0

'resp [" czas "]' to znacznik czasu, na który liczysz? – Bergi

Odpowiedz

1

Podejdę do tego samego podejścia, co gry sieciowe dla wielu graczy. Nawet podczas krótkich chwil zakłóceń połączenia (na przykład "opóźnienie"), klient projektuje oczekiwane trajektorie w tym czasie. W takim przypadku polegasz na lokalnym interwale i aktualizujesz dokładny czas serwera, gdy otrzymasz odpowiedź asynchronicznego pulsu.

-1

setTimeout i jego bracia są znane jako niewiarygodne. Jest jeszcze jeden wpis na ten temat: Is there a more accurate way to create a Javascript timer than setTimeout?, który daje kilka wskazówek.

+0

, że setTimeout wykonuje tylko funkcję okresowo, ale nie wykonuje żadnych czasowych obliczeń. odbywa się to poprzez Date –

+2

To dlatego, że nie sądzę, że przeczytałeś mój kod, tylko zobaczyłem setTimeout() i natychmiast założyłem założenia. To nie jest tak, jak publikujesz odpowiedź. Może komentarz. –

+0

Masz rację, zareagował zbyt szybko. Trochę mnie bity w zeszłym tygodniu, więc doszedłem do wniosku, że to zbyt szybko. –

Powiązane problemy