Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lagi na serwerze

Ostatnio zmodyfikowano 2018-03-31 11:39
Autor Wiadomość
skovv
Temat założony przez niniejszego użytkownika
Lagi na serwerze
» 2018-03-26 22:26:31
Witam ponownie

Mam pytanko czysto teoretyczne :) Pisze gre platformowa 2D, aktualnie jedynie poruszanie postacia: lewo/prawo i skok. Aby nie meczyc serwera praktycznie wszystko liczone jest po stronie klienta. Kiedy gracz wykonuje ruch(przycisnal/zwolnil klawisz a/d) klient wysyla informacje o zamiarze ruchu, serwer rozsyla wszystkim info "ten pan sie porusza/zatrzymuje". Przy skoku jest podobnie. Kazdy taki pakiet jest wielkosci okolo 30-35b, konkretnie: komenda, idklienta, kierunek(-1/0/1), pozycjax, pozycjay. Mam slabe lacze wiec ciezko mi ocenic, ale gralem ze znajomym i mowi, ze czasem mu scinalo a gralismy we dwojke. Serwer nie smiga jeszcze na watkach, zastanawiam sie jak to wszystko zrobic najlepiej dlatego zglaszam sie tutaj, ma ktos moze doswiadczenie? Aktualnie serwer dziala tak: Accept(tcp, odblokowany socket), recv(TCP kolejno od kazdego gracza), recv (UDP). Serwer jest w chmurze, nie powala: 1gb ram, 1cpu, Debian 8 64, Lacze raczej bardzo dobre. Pingowalem od siebie i zyskuje okolo 50-60ms na swoim laczu, roznie, nie jest chyba zle

Do sedna:
-> Czy gdybym ograniczyl wielkosc pakietu z 30-35 do nawet 20 byloby lepiej? Znacznie?
-> Cala rozgrywka opiera sie na UDP, moze warto uruchomic ten protokol na osobnym watku?
-> Co myslicie o takim serwerze, mooozna cos z niego wycisnac?
-> Gdyby ktos mial cos do zaproponowania w dowolnej kwestii - smialo! :)

Dziekuje za pomoc,
Pozdrawiam
P-170287
DejaVu
» 2018-03-27 21:43:43
60ms to słaby ping. W każdym razie całą komunikację powinieneś zrobić w oparciu o UDP. Jeżeli nie chcesz mieć wrażenia opóźnienia to klient powinien wykonywać ruch natychmiast, a nie czekać aż serwer wyśle nową pozycję dla klienta. Rozwiązywanie problemów 'jak gra powinna się zachować' gdy klient wykonuje przemieszczenia natychmiast jest stosunkowo trudna. Rozwiązywanie problemu poprzez wyświetlanie aktualnej pozycji graczy tylko i wyłącznie na podstawie stanu serwera = opóźnienie dla gracza.
P-170328
skovv
Temat założony przez niniejszego użytkownika
» 2018-03-27 22:46:45
Tcp stosuje tylko do najważniejszych zadan: przyjmowanie graczy, autoryzacja UDP, wysyłanie listy pozostałych graczy. Spawn, poruszanie i inne bedzie smigac w pelni na UDP. Zrobię jak napisałeś, myślałem o tym i tak naprawdę nie ma innej możliwości. Wyjdzie w sumie jak w każdej grze: kto nie ma pingu ten ma lżej :D O ile własna postać nie bedzie mulic to przeciwnicy jiz troszkę mogą, ale myślę, że ten problem zniknie na serwerze z lepszym łączem. Zmniejsze także rozmiar pakietu, powinno pomoc. Przy skoku musze przesłać pozycję początkową, jeśli nie to zakładając, że ktoś ma lagi i skoczy po prostu z pozycji w której znajduje sie u danego klienta to niestety wynik skoku moze się barfzo różnić, prawda? Podobnie z atakiem, który także ma się opierać na kolizjach. Mam nadzieje,  że mniejsze pakiety i lepsze łącze na serwerze załatwi  sprawę :)
P-170329
DejaVu
» 2018-03-28 21:27:30
Ja bym na Twoim miejscu nie liczył na to. Ja miałem serwer gdzie pingi były na poziomie 25ms i robiłem rozwiązanie polegające na tym, że klient tylko wysyłał 'eventy' i te eventy były wykonywane na serwerze. Klient jedyne co robił to odbierał aktualne pozycje obiektów. 25ms to mało, ale im ping był większy tym responsywność mocno spadała. Zrób prostą aplikację w SFML i dodaj jakieś opóźnienie 50ms na obsłudze sterowania jakimś kółkiem.
P-170335
skovv
Temat założony przez niniejszego użytkownika
» 2018-03-31 11:39:05
50ms na moim laczu, nie ogolem. Po za tym server kosztowal jakies 5zl wiec nie ma co sie czepiac :D Moglbym zrobic obliczenia po stronie servera, jednak podniesie to drastycznie jego minimalne wymagania. Przerobilem protokol, usprawnilem i smiga bardzo dobrze.
P-170383
« 1 »
  Strona 1 z 1