Autor Wątek: Organizacja architektury serwera.  (Przeczytany 3047 razy)

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 29, 2011, 18:16:16
Serwer oparłem na FixedTimeStep. Polega to mniej więcej na czymś takim:

// postep gry
if(Gui->Start) Game.Progress();       // <- logika. niekontrolowana FTS'em. liczenie pozycji pocisków i bonusów oraz wykrywanie kolizji (kolizja = komunikat)
// Sprawdzanie pakietow przychodzacych
if(Gui->Start && CanUpdate()) CheckIncomingPackets();  // <- odbiór pakietów od klientów (niektóre są przesyłane dalej, inne (jak stworzenie pocisku) gneruje odpowiedni pakiet do klientów
// Wysłanie aktualizacji do graczy
if(Gui->Start && CanUpdate()) SendActualizations(); // <- przesłanie aktualizacji o pozycji bonusów i pocisków (1 pakiet)
if(Gui->Start && CanUpdate()) UpdateStats(); // <-- przesłanie aktualizacji o punktach (1 pakiet)
// Tworzenie losowych bonusow
if(Gui->Start) CreateBonus();            // <-- losowe tworzenie bonusów (od czasu do czasu 1 pakiet)
if(Gui->Start) CTFUpdate(); // <--- aktualizacja trybu CTF. bez pakietów.

Klient przetwarza i wysyła pakiety tylko co 0.012s (ok 80 razy/s), przy czym sam liczy kolizje gracza z platformami. Wtedy tylko przesyła pozycje i animację do innych klientów. To ma na celu odciążyć serwer.

I o ile łącząc się na bramę zwrotną (127.0.0.1) wszystko działa bez problemowo. To łącząc się z kolegami:
- chat działa normalnie
- pakiety z pociskami, kolizjami i pozycją graczy gdzieś giną. albo są źle przetwarzane. albo ich jest za dużo? (wrażenie jakby inni gracze się przycinali albo w ogóle nie chodzili)

Serwer biega na porcie 8080 a Klient używa "pierwszego wolnego" portu.

Am I doing sth wrong?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline yarpen

  • Użytkownik

# Sierpień 29, 2011, 18:17:35
1) 80 razy na sekunde to zdecydowanie za czesto.
2) Jakiego protokolu uzywasz?

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 29, 2011, 18:58:44
1. Myslalem (to moj pierwszy projekt z siecia) ze jesli mam mniejsze pakiety <mniej niz 1kb lacznie> to moge troche wiecej razy aktualizowac. Zmienie do jakichs 50.
2. UDP.

Offline yarpen

  • Użytkownik

# Sierpień 29, 2011, 19:02:39
Zazwyczaj gry wysylaja pakiety jakies 10-20 razy na sekunde, nie ma specjalnie sensu wysylac co ramke, ale to akurat ma mniejsze znaczenie. Twoj problem lezy prawd. wlasnie w wybranym protokole, jezeli uzywasz UDP, to sam musisz zadbac o kontrole tego czy pakiet dotarl i jego ewentualne ponowne doslanie, re-ordering jezeli to konieczne, kontrole tego ile pchasz danych (congestion control, nie wiem jak to sie oficjalnie tlumaczy) itd. Zaczalbym od przelaczania na TCP i sprawdzenia czy to pomoze. Jezeli tak, to wiadomo gdzie lezy problem.

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 29, 2011, 19:40:39
Mozliwe, ale specjalnie uzylem gotowej biblioteki (RakNet) aby uniknac tych problemow. Sproboje tez (jak pojawie sie w domu) przestawic na tcp.
Czy moze sie do tego przyczynic roznica portow? Albo firewall zatrzymuje jakies pakiety?

Offline yarpen

  • Użytkownik

# Sierpień 29, 2011, 20:34:38
Jezeli uzywasz RakNeta, to faktycznie powinno byc OK. Gdybys wyslal na zly port, to nie dostalbys zadnego pakietu. Dodaj logowanie + jakas sume kontrolna i sprawdzaj czy dostajesz wszystko (byc moze RakNet ma tez jakies narzedza do tego).

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 29, 2011, 21:01:26
Logowanie w platformówce? Hm... słabo to widzę :P

A nie robi różnicy różnica portów? np. Serwer to 8080 a Klient 65323?

Jutro z rana zacznę poprawki. Może na przed WGK zdążę.

Offline ShadowDancer

  • Redaktor

# Sierpień 29, 2011, 21:02:31
Logowanie w platformówce? Hm... słabo to widzę :P

Logowanie co odebrano, co przyszło... W sensie log - dziennik.

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 29, 2011, 22:37:16
Ah spoko. Mam log, ale polaczen i chatu. Dzieki za wskazowki :)

Offline ShadowDancer

  • Redaktor

# Sierpień 30, 2011, 02:02:53
Jak sobie życzysz, to miałem gdzieś napisaną klasę loggera w cpp z asynchroniczną konsolę, dowolnymi wyjściami i różnymi niepotrzebnymi duperelami. Jeśli chcesz, to daj znać na pw mogę napisać. Chociaż napisanie czegoś takiego to oczywiście 10 minut ;)

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 30, 2011, 09:49:24
Nie no loggera jeszcze potrafię napisać :P
Biorę się do pracy. Dam znać jak będą jakieś postępy.

// czas zmienić telefon na jakiś z obsługą znaków diakrytycznych w aplikacjach, bo jak czytam swoje poprzednie posty...
« Ostatnia zmiana: Sierpień 30, 2011, 09:59:36 wysłana przez Ivian »

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 30, 2011, 17:32:05
W końcu dorwałem kogoś chętnego do pomocy przy testach.

Wygląda to tak:

Klient dobrze wysyła pakiety na serwer. Ale żaden nie przychodzi do klienta (poza ID_CONNECTION_NOTIFICATION (po 5 próbach)). Test wykonałem wyrzucając sobie info w konsoli podczas odbioru ID_BULLET_CREATE, który wysyła najpierw klient na serwer, a klient przesyła go do wszystkich. Żaden nie dochodzi. (test 1000 pocisków).

Czyli raczej trzeba zmienić protokół. Idę googlać.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Sierpień 30, 2011, 17:54:48
udp hole punching

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 30, 2011, 18:10:34
Hym... czy ja wiem, czy RakNet ma to już przypadkiem "w zestawie" ?

Odkryłem ciekawostkę. Pakiety docierają. Ale z masakrycznym opóźnieniem. (łot de łot de?). A do serwera dochodzą niemal automatycznie.

Offline yarpen

  • Użytkownik

# Sierpień 30, 2011, 18:12:52
RakNet nie powinien gubic pakietow. Bardziej prawdopodobne, ze zapychasz downstream. Nie ma tam jakichs opcji, zeby dostosowywal ilosc przeslanych danych do mozliwosci lacza?