Wątek przeniesiony 2018-07-30 08:13 z Nietuzinkowe tematy przez Shalom.

Jak laczy sie ze soba klient-serwer, zeby obslugiwal gre na np 10 graczy real-time

0

Witam, niedawno zakladalem temat w sprawie znalezienia odpowiedniego jezyka do napisania programu, trafilo mi sie na C# z racji tego ze mozna latwo zrobic aplikacje typu gra multiplayer.
Nie potrafie niestety zrozumiec jak to dziala i w tej kwestii prosze o czysto-teoretyczna pomoc.

Chcialbym wykupic hosting na moja gre i trzymac tam server - czyli jak rozumiem aplikacje ktora laczy sie z baza danych trzyma tam wszystkie informacje o uzytkownikach przedmiotach i tak dalej.
Druga aplikacja dla uzytkownikow czyli sama "gra", i tego nie moge zrozumiec na jakiej zasadzie to dziala. Czy moze mi ktos wytlumaczyc jak wyglada to polaczenie miedzy tymi dwoma aplikacjami?

0

Tworzysz aplikację "serwer", która jest odpowiedzialna za odbieranie, wysyłanie pakietów. To własnie ta aplikacja obsługuje połączenia z bazą danych. Przykładowo aplikacja kliencka po wpisaniu przez gracza loginu i hasła wysyła pakiet z tymi danymi dot. logowania na serwer. On pobiera informacje z bazy np. interesuje Cie gracz, który ma unikalną nazwę użytkownika. Serwer sprawdza zgodność haseł i wysyła jakieś zwrotne dane. Mogą to być informację dot. ekwipunku, które również są dostępne w jakiejś tabeli w bazie.

3

masz np. 3 klientów - A, B i C i serwer - S
klient a przesuwa się o jedno pole do przodu to dzieje się to tak
A -> S "przesuń do przodu o 1"
S - "sprawdza czy A może przesunąć się do przodu o 1"
S -> A "OK", A przesuwa się do przodu o 1
S - > B "A przesunął się do przodu o 1", B powinien w swoich lokalnych danych przesunąć A o 1 do przodu
S - > C "A przesunął się do przodu o 1", C powinien w swoich lokalnych danych przesunąć A o 1 do przodu

i tak to mniej więcej wygląda - czyli klient coś chce zrobić, pyta serwer czy może, serwer potwierdza lub zaprzecza, jeśli potwierdził to wysyła info do pozostałych klientów. Inny przykład
A -> S "strzelam do w kierunku X,Y"
S - "sprawdza czy A w coś trafił"
S -> A "trafiłeś C - zginął"
S -> B "A trafił C i C zginął"
S -> C "A cię trafił i zginąłeś"

Oczywiście są techniki poprawy płynności przy słabym łączy czy obciążonym serwerze - "jechanie na pałę" czyli klient przez pewien czas porusza się bez komunikacji z serwerem a jedynie opierając się na danych jakie ma "u siebie" a po potwierdzeniu wszystkich ruchów aktualizuje swoje lokalne dane (może się okazać, że zamiast przejechać 20 punktów do przodu to zginął będąc w punkcie 15). Innym sposobem jest wysyłanie danych między klientami do siebie (aby odciążyć serwer) a aktualizacja lokalnych danych z serwerem co jakiś czas lub jeśli przychodzące dane od innego klienta są kluczowe (np. A -> C "trafiłem cię") lub "niepewne" (np. przeskok o 100 pól, który normalnie nie występuje).

BTW baza danych do tego wcale nie jest konieczna, w szczególności przy FPSach jest wręcz niewskazana do trzymania danych userow - jest po prostu za wolna na dużą ilość klientów i ilość danych jakie oni generują. Nic natomiast nie stoi na przeszkodzie aby w bazie trzymać bardziej "statyczne" dane - np. wyposażenie, statystyki itp. Natomiast jeśli mówimy o grze przeglądarkowej to jak najbardziej opiera się ona o BD

0

Jakby OP był zainteresowany, można sprawdzić jak to robił Quake - https://github.com/id-Software/Quake/tree/master/QW/server

1 użytkowników online, w tym zalogowanych: 0, gości: 1