Autor Wątek: Optymalne rozwiązanie dla większej ilości graczy.  (Przeczytany 34132 razy)

Offline krowal

  • Użytkownik
    • MargoExtend.net

# Luty 24, 2011, 15:39:17
Mam napisany taki mały serwer w Javie. Czatuje on sobie na jednym porcie przyjmując nowe połączenia i przypisując im odrębne kanały na tym jednym sockecie (socket channel) jak mi to podpowiedziano w innym temacie.

Planuje na tym postawić grę w 2d, obliczenia w niej są dość proste bo chodzi tylko o przeliczanie pozycji i obrotu danej jednostki, dojdzie pewnie jeszcze jakieś strzelanie itp, ale nic skomplikowanego raczej. No i teraz mam dylemat, czy robić obliczenia w kliencie i przesyłać pozycję do serwera -> jak się wtedy zabezpieczyć przed hackowaniem (kod klienta jest w JS więc łatwo go zmienić). Zaś jeśli zrobię te obliczenia na serwerze to czy taki serwer wyrobi ?

Dodatkowo chciałbym na serwerze sprawdzać które jednostki są widoczne dla danego klienta, tzn czy są w jego polu widzenia i jeśli tak to wysyłać informacje o tych obiektach do klienta. Żeby to zrobić musiałbym dla każdego klienta iterować po wszystkich pozostałych klientach i obliczać odległość od niego. Ja tu widzę obliczenia rzędu n*n, czyli dużo :). Na myśl mi jakieś drzewa przychodzą, ale nie wiem jak je ugryźć.

Czy da się to jakoś optymalnie rozwiązać ? Jak nie zamulić serwera ?

Offline Mr. Spam

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

Offline Manual

  • Użytkownik

# Luty 24, 2011, 17:52:41
Co do pierwszego to raczej na pewno wytrzyma(są emulatory serwerów, które robią sporo obliczeń po swojej stronie i bez problemu dają radę obsłużyć dziesiątki klientów).


Co do drugiego, możesz spróbować jakiegoś podziału przestrzeni. Możesz trzymać stany kafli i listę widzianych z niego pozycji i wtedy sobie tylko iterujesz po tych kaflach widzianych z tego na, którym stoi gracz. Przeanalizuj źródła jakichś serwerów gier 2D i na pewno jakiś sposób Ci się spodoba.
« Ostatnia zmiana: Luty 24, 2011, 17:55:15 wysłana przez Manual »

Offline krowal

  • Użytkownik
    • MargoExtend.net

# Luty 24, 2011, 20:49:19
Pomysł z kaflami mi się podoba :) Mam jeszcze jedno pytanie. Czy dobrym pomysłem jest przesyłanie na serwer tylko stanów klawiszy wciśniętych/puszczonych przez gracza i na nim robienie całego ruchu i symulacji, czy też robi się to w jakiś inny, lepszy sposób ? No i jeszcze jedno, czy to normalne że w tym temacie jest 4k odwiedzin (na tę chwilę) i rośnie w zastrzaszającym tępie ? :D

Offline Manual

  • Użytkownik

# Luty 24, 2011, 22:13:37
Masz wtedy całkowitą kontrolę i nie straszne Ci jest oszukiwanie klientów, ale czy serwer da radę to obsłużyć to zależy od ilości klientów oraz ilości operacji jak sprawdzanie kolizji itp. ; )

W Quake czy bodajże nawet w CS'ie jest właśnie tak zrobione, że klient odpowiada tylko za input i rendering. Serwer działa na zasadzie tików, symuluje świat i  wysyła stan sceny z odpowiednią częstotliwością + kilka technik maskowania lag'ów itp.
Na prawdę radze Ci spojrzeć do jakichś źródeł byś znał wiele możliwości i wybrał tą, która jest najbardziej dostosowana do Twojej rozgrywki.

Btw. w dzisiejszych czasach to nawet usługa Live daję radę, więc wszystko o co pytasz to można było się zastanawiać 10 lat temu czy da radę.

Skoro piszesz w Javie to poczytaj trochę o pulach wątków, proste do implementacji i skutczne, wiem z doświadczenia ; )
« Ostatnia zmiana: Luty 24, 2011, 22:20:18 wysłana przez Manual »

Offline krowal

  • Użytkownik
    • MargoExtend.net

# Luty 24, 2011, 23:20:29
W Quake/CS jest maksymalnie 16? graczy :) No ale ja takich precyzji a co za tym idzie i obliczeń jakie są w tego typu grach nie potrzebuję więc może mój serwer udźwignie większą ilość graczy :)
Co do źródeł o których wspominasz, znasz może jakieś bo wszystko co znalazłem to jakieś silniki gier 2d, ale niekoniecznie serwery ;)
Trochę nie rozumiem zasady puli wątków, masz jakieś materiały o tym, przykłady zastosowania, które łatwo zrozumieć ? Nie jestem wielce zaawansowanym programistą Java, ale z tego co zrozumiałem chodzi o możliwość łatwego dostępu do obiektów przez kilka wątków naraz ? W moim przypadku byłby to wątek nasłuchujący oraz wątek głównej pętli sterowania obiektami i światem. Dobrze myślę ?

Dzięki za pomoc, wyjaśniłeś mi wiele spraw, które śniły mi się po nocach :D