Sieciowy Pong - lagi

Sieciowy Pong - lagi
TA
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 13 lat
0

No więc chciałbym napisać sobie sieciowego ponga w klient-serwer (dwóch klientów). Zaimplementowałem sobie ruchy paletkami, tj. klient ruszając myszką powoduje ruch paletki i na bieżąco ją sobie maluje metodą repaint(), zaś Timer co ileś tam ms najpierw sprawdza, czy położenie paletki zmieniło się względem ostatniego sprawdzenia, jeśli tak, to wysyła pozycje jego paletki do serwera, serwer odsyła ją drugiemu klientowi. W localhoście wszystko śmiga aż miło, jednak gdy uruchamiam serwer na swoim koncie shellowym mam spore lagi.
Tutaj jest kod zadania timera (nr to numer klienta, 1 to klient z lewą paletką, 2 - z prawą, tab1 to położenie lewej paletki w pionie, tab2 - drugiej, dodam, że dataout jest typu DataOutputStream)

Kopiuj
class Zadanie extends TimerTask
{
public void run( )
{
        try
        {
           if ((nr==1)&&(tab1!=ostatni)) dataout.writeShort(tab1);
           if ((nr==2)&&(tab2!=ostatni)) dataout.writeShort(tab2);
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
        if (nr==1) ostatni = tab1;
        if (nr==2) ostatni = tab2;
        repaint();
}
}

W tej sytuacji klient wysyła położenie paletki tylko gdy zmieniło się od poprzedniego sprawdzenia - w takiej konfiguracji mam lagi. Dziwną rzeczą jest fakt, że jesli klient nie sprawdza, czy położenie paletki zmieniło się, tylko wysyła cały czas w timerze co kilka ms (czyli w konsekwencji częstotliwość wysyłania jest dużo większa) to lagów paradoksalnie nie ma!

Tutaj przerobiona wersja zadania timera (wysyła dane bez sprawdzeń przy każdym "ticku" timera ,lagów nie ma):

Kopiuj
class Zadanie extends TimerTask
{
public void run( )
{
        try
        {
           if (nr==1) dataout.writeShort(tab1);
           if (nr==2) dataout.writeShort(tab2);
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
        repaint();
}
}

Przecież nie powinienem zużywać łącza w przypadku, gdy nie ma takiej potrzeby. Jak rozwiązać ten problem?
Tu daję cały kod, fajnie, jakby ktoś przetestował:
http://www.speedyshare.com/files/27679645/Net_Pong.rar

edytowany 1x, ostatnio: Tamyl
Kerai
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:London
0

a robisz flush() ?

snout
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:37
0

jeśli masz użyte Timer na na obu klientach istniej pewien rodzaj synchronizacji klientów. Problem nie polega na tym, że przy Timerze bardziej obciążane jest łącze. Dla takiej gierki lagi powinny być minimalne (zawsze są). Ale np taka sytuacja:
nie masz timera, na jednym z klientów w tym samym czasie klasę do wyświetlanie che wywołać drugi klient oraz ruch pierwszego klienta. Nie jestem pewny jak zachowa się aplikacja.


Naród wspaniały, tylko ludzie ch..je:(
- wódz i kochany ojczulek narodu: Józef Piłsudski
TA
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 13 lat
0

Kerai, mam flush po każdym write do outputstreama.
snout, chodziło mi o to, że Timer sprawdza, czy ostatnie położenie paletki różni się od obecnego, jeśli jest taki sam, to żadnych danych nie wysyła. Zatem Timer klienta wysyła na serwer dane tylko w momencie, gdy klient rusza paletką, jeśli klient przestaje ruszać paletką, to dane nie są wysyłane, czyli w konsekwencji serwer działa mniej więcej tak:

Kopiuj
>otrzymałem liczbę 300, wysyłam ją dalej
>otrzymałem liczbę 301, wysyłam ją dalej
>otrzymałem liczbę 302, wysyłam ją dalej

(tutaj klient przestaje ruszać paletką, więc serwer nic nie dostaje)

...

(tutaj klient znowu rusza paletką)
>otrzymałem liczbę 303, wysyłam ją dalej
>otrzymałem liczbę 304 wysyłam ją dalej

Dane do serwera dochodzą płynnie, bez większego opóźnienia, zaś u klienta, który odbiera dane ruch paletki przeciwnika mocno się tnie, jakieś 5 klatek/sek

Natomiast gdy wysyłam w Timerze położenie paletki non stop, np. co 5ms, lagów nie ma, wtedy serwer działa tak:

Kopiuj
>otrzymałem liczbę 300, wysyłam ją dalej
>otrzymałem liczbę 301, wysyłam ją dalej
>otrzymałem liczbę 302, wysyłam ją dalej (teraz klient przestaje ruszać paletką, mimo to serwer non stop wysyła położenia paletki do drugiego klienta)
>otrzymałem liczbę 302, wysyłam ją dalej
>otrzymałem liczbę 302, wysyłam ją dalej
>otrzymałem liczbę 302, wysyłam ją dalej
>otrzymałem liczbę 302, wysyłam ją dalej
>otrzymałem liczbę 302, wysyłam ją dalej (teraz klient znowu rusza paletką)
>otrzymałem liczbę 303, wysyłam ją dalej
>otrzymałem liczbę 304, wysyłam ją dalej
>otrzymałem liczbę 305, wysyłam ją dalej

Zrobiłem jeszcze taki test, że każda odebrana liczba od serwera np. przez klienta1 była dodawana do ListBoxa (chciałem zobaczyć, czy klient dostaje wszystkie dane, czy np co 5, co by łumaczyło lagi), podczas ruchu paletki klienta2 lista u klienta1 się "wieszała" na moment, zaś po tym odwieszeniu na liście u pojawiało się kilka nowych wartości, np 301,302,303,304,305, zatem klient otrzymuje wszystkie dane, tyle, że nie każdą po kolei, tylko po kilka w jednej "paczce"...

Naprawdę nie wiem jak sobie z tym poradzić, liczę na pomoc.

edytowany 1x, ostatnio: Tamyl
TA
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 13 lat
0

Nikt nie poratuje? Co myślicie o przerobieniu Socketów na DatagramSockety i wysyłaniu paczek w oparciu o protokół UDP? Czy jest szansa, że to pomoże?

edytowany 1x, ostatnio: Tamyl
Kerai
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:London
0

Nie... rób to bez timera - on opóźnia wysyłanie...

TA
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 13 lat
0

Początkowo miałem bez timera, wysyłałem dane w MouseMoved i miałem identyczne opóźnienia.

edytowany 1x, ostatnio: Tamyl
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)