Myślę że z zaimplementowaniem samej gry/gier nie będę miał problemów, często mam problem z wymyśleniem odpowiednich mechanizmów. Fajnie byłoby gdyby ktoś mógłby na nie odpowiedzieć.
Celuję w jak najprostszy kod, i server obsługujący ~ 5-10 graczy.
-
Czy UDP <ort>na prawdę</ort> jest konieczny, nawet dla gier akcji? Wydaje mi się że ten "wolny" TCP nie będzie aż taki zły, ponieważ jest more reliable i połączeniowy poza tym, jaka może być różnica w 50 pakietach na sekundę? (Mogę się mylić). Próbowałem znaleźć jakieś testy na internecie ale nie dostałem informacji o rzeczywistych stosunkach w różnicach szybkości obu. Poza tym, wolałbym implementować tylko jeden protokół (a TCP jest konieczny dla akcji które muszą być 100% dostarczone, jak wiadomości chat).
-
Skorzystać w końcu z UDP czy z TCP? Wydaje mi się że z UDP mógłbym broadcastować pakiety do wszystkich na raz, a przy TCP trzeba robić osobny wątek dla każdego połączenia (nie? chyba)? Ale i tak raz wysyła się różne informacje do różnych graczy. Nie wiem, i need help.
-
W jakiej postaci wysłać np. zmiany położenia gracza do servera? Zastanawiałem się nad:
- Wysłanie
absolute position
(otwarte na hacksy typu "teleporty" i takie tam, ale raczej nikomu nie będzie się chciało hackować mojej gry) oraz błąd obliczeniowy doubli - na różnych maszynach pozycje/kolizje mogą być obliczane troszkę inaczej. - Wysłanie
relative position
czyli np.10 jednostek w prawo od ostatniego położenia
. Co jeśli pakiety dotrą w innych kolejnościach (i ruch będzie wyglądał "prawo lewo" zamiast "lewo prawo")? Czy różnice będą zauważalne dla 50 pakietów/sek? - Wysłanie naciśniętych klawiszy do servera - tak by po czasach otrzymania pakietu server sam obliczył zmianę pozycji, i odesłał do klienta pozycję. (klient od razu ruszy postać zależnie od klienta, a potem dostanie potwierdzenie od servera).
- Wysłanie
-
Czy wysyłać "heartbeat"? Tzn czy klient ma wysyłać info do servera i z powrotem dopiero kiedy coś się stanie, czy raczej
constantly
? Gdyby były wysyłane non-stop mógłbym prawie natychmiast wykryć zerwanie połączenia i wyświetlić stosowny komunikat, nie wiem jednak czy nie spowoduje to zwiększonych ruchów między serverem a klientami. -
W jakiej postaci chermetyzować kod? (Nie wiem czy tak się to nazywa) Czytałem o mvc i zawsze starałem się wkładać różne części programu do osobnych namespaców/packagy (tak że
model
miał dwa polaview
icontroller
które dostawały referencję do modelu w konstuktorze (tak się to robi?) (offtop: skoro i tak jest jeden model, jeden view i jeden controller na program to czemu nie robi się ich klasami statycznymi i wtedy nie ma potrzeby robić referencji ani nic?)). -
Czy GUI możebyć w nieskończonej pętli? Do tej pory jak robiłem gry
singleplayer
to tworzyłem okno a potem odpalałem nieskończoną pętlę która pobierała aktualny czas, wywoływałaupdate();
(który brał informację z innych klasWorld
etc i ogarniał logikę) dokładnie 100 razy na sekundę niezależnie od prędkości kompa w miarę równych odstępach czasu, a potemrender();
(który brał info z jeszcze innych klas opisujących animacje, klasy od trzymania i obracania i przycinania obrazków, oraz klasy do ładowania plików z dysku) wtedy kiedy dał radę (czyliupdate();
zawsze 100 razy, arender();
kiedy się da). Noii, w tej nieskończonej pętli pobierałem też stan klawiszy (i dziwne, ale ta nieskończona pętla nie blokuje ani pobierania klawiszy (podejrzewam żeaddEventListener
może być asynchoniczny ale nie wiem), ani wyświetlania rzeczy w oknie, ale coś mi mówi że to może nie być najlepszy sposób na wświetlanie grafiki w oknie). Miałem plan na to żeby jednak komunikację z serverem dać do osobnego wątku na wypadek jakieś timeoutu na 1 sekundę, żeby nie było wrażenia zacięcia gry. ** Na tym punkcie mi najbardziej zależy, czy robię wszystko ok**.
Wiem że to podstawowe pytania ale dopiero teraz zabieram się za napisanie pierwszej gry multiplayer (do tej pory nie było jak) i proszę o w miarę wyczerpujące odpowiedzi (na takich mi najbardziej zależy).
Dodam że do testów mam w domu 2-3 komputery w lanie, i nie mogłem sprawdzić sobie jak to będzie wyglądać z udp lub tcp i czy domowy komputer może obsłużyć 10 połączeń na raz (ale myślę że prawie na pewno tak).
PS;
- Czy wysyłać informacje z servera ciągle, czy tylko po otrzymaniu wiadomości od klienta? Czyli np jak klient nie wyśle pakietu przez sekundę to przez tą sekundę server nie odpowie.