Kod sieciowy gry

0

Szukam, szukam i szukam... Nic nie znajduję. Same teksty w stylu "Napisz własnego czata". Ciekaw jestem, czy próbowaliście kiedyś napisać własny kod sieciowy. Ja napisałem własny, ale nie wiem, jak skutecznie wysyłać dane o sytuacji gracza przez słabe łącze.

Nie mam doświadczeniu w programowaniu gier sieciowych, ale wiem, że kod polega na ciągłym wysyłaniu informacji gracza i na ciągłym odbieraniu oraz aktualizowaniu pozycji/stanu przeciwników. Zrobiłem tak i działa, ale przez modem robi się straszny slide show, głównie przez dużą ilość informacji do wysłania/odebrania przezeń.

Wpadłem na pomysł, aby wysyłać dane okresowo. No, ale wtedy przepadnie wiele ważnych informacji (strzały, fragi). Jak więc uczynić, aby gra działała w miarę szybko, i aby nie było ew. niezgodności spowodowanych utratą danych poprzez wysyłanie okresowe? Macie jakieś koncepcje na ten temat?

Z góry dziękuję.

0

W każdej grze sieciowej znane jest zjawisko lagów. Jest to opóźnienie spowodowane tym, że łącze nie wyrabia przesłać wszystkich potrzebnych informacji. Jedyną chyba skuteczną metodą na ich ograniczenie (poza załatwieniem lepszego łącza ;) ) jest optymalizacja informacji - wybór tych informacji, które wystarczą klientowi do odwzorowania świata, a które nie zajmują dużo miejsca. Przykładowo jeśli masz jakiś duży świat, to wystarczy, że prześlesz informacje dotyczące najbliższego otoczenia gracza. Oczywiście tutaj już wszystko zależy od tego, jaka to gra konkretniej.

0

Poza tym dużo rzeczy możesz policzyć po stronie klienta, bez pytania serwera o zgodę. Należą do niech nie tylko informacje o animacjach (pokazanie przechodzenia przez planszę i takie tam), ale również pewne działania, które wynikają z poprzednio przekazanych informacji (jeśli inni gracze są daleko, pewnym jest, że życia natrafionego potwora nie ulegną zmianie w sposób nieprzewidziany).

Ale wszystko zależy od typu gry. Napisałem kilka programów sieciowych i wiem z doświadczenia, że jak wykorzystasz wszystkie sztuczki by gra mniej przesyłała, w końcu powinna chodzić zadowalająco płynnie.

0

Tak jak napisał Szczawik, trzeba wysyłać tylko te informacje, które są niezbędne, np. jeśli twój przeciwnik wystrzelił pocisk, to wystarczy, że znasz prędkość i kierunek jego lotu i wtedy nie musisz co chwilę odbierać od serwera informacji o jego pozycji, sam ją sobie obliczasz. To samo można robić z pozycją graczy, jeśli ktoś ma słabe łącze to info o tym, gdzie znajdują się gracze może i wysyłać co kilkadziesiąt klatek, resztę może sobie obliczyć znając wcześniejszy kierunek biegu i prędkość.

0

http://ef.milospamkiller.com - to moja gierka, pisana przy pomocy Indy (tj kod sieciowy), jak masz jakis konkretny problem/pytanie to wal smialo. Ew. GG: 882821.

0
SeaSoft napisał(a)

kod polega na ciągłym wysyłaniu informacji gracza i na ciągłym odbieraniu oraz aktualizowaniu pozycji/stanu przeciwników.

I po co? Jeżeli gracz się ruszy to jego klient wysyła info do serewa, że zrobił krok w tym i tym kierunku. Jeżeli zmienił pozycję ( ze stania przeszedł do leżenia etc ) to jego klient wysyła to do serwera. A z tej drugiej strony to: jeśli dany gracz zrobił krok w danym kierunku to jeżeli w pobliżu są gracze, którzy mogą go zobaczyć to dostają info iż ten i ten gracz zrobił krok z ... na ...

0

Stary coś słabo szukasz...
Tyle się bawiliśmy ze znajomymi żeby wszystko było jak trzeba, a Ty śmiesz mówić że nic nie znajdujesz...
To ja się pytam po jaką cholerę ja piszę do autora o możliwość udostępnienia jego kodu ludziom jak Ty i tak nic nie znajdujesz :[
WAAAGH!!!

A teraz właź na www.unit1.pl i masz sobie sam znaleźć coś takiego "BattleField 2D Client and Server" a jak już znajdziesz to masz sobie oglądnąć, przemyśleć i nie zadawać pytań "a do czego ta procedura?"

Pozdrawiam...

0

Generalnei zmienjszyć ilośc danych przesyłanych przez sieć, w krańcowym wypadku stworzenie własnego pseudo protokołu. Nie musisz wysyłać zawsze pełnych informacji, możesz zastapić nazwę gracza kodem, nie musisz przesyłać nazw, ani rozbudowanych struktur/ramek danych, mozesz zrobic cos w rodzaju protokolu binarnego.
Zamiast przesylac ruch|gracz wielki rycerz|pole duza zielona łaka|ruch....
mozesz przesłac ruch|gracz 12|pole 10|ruch
a dalej ruch|0012|0010|ruch
a dalej 01|0012|0010|01
a dalej |0100120010|01
a dalej |01001200100012001200340021|02 - wszystkei ruchy razem dzięki stałopozyjnej metodzie zapisu, jako pierwszy po | idzie dwuznakowy rodzaj akcji a potem az do następnego | po kolei ruchy
a dalej skoro mamy stałopozycyjnosc to moze liczby w heksa - wiecej wejdzie na tych samych pozycjach- zamiast dla przewidzianych 1500 graczy mieć 4 pola, to masz 3 poal w hex (1500 dec=5DC hex - i jaki jeszcze zapas)
|01000C000A000C000C00220015|02
a dalej - a może przesyłac to binarnie a nie znakowo - tylko trzebaby ustalić inny znak separatora -nie wiem moze 00000000 i nie uzywac w numeracjach 0 - 1 gracz ma numer 0001 itd.
Im bardziej gmatwasz tym wiecej pracy przy nadawaniu i odbieraniu, tym bardziej wzrasta obciązenie komputerów lokalnych, ale tym bardziej zmniejsza się ilosc danych przesylanych po sieci, a przez to mniej lagow, szybciej gra chodzi, a wąskim gardłem jest sieć a nie możliwość lokalnych komputerów.
Oczywiście po zainicjowaniu gry dalej juz tylk oprzyrostowo aktualizowac najblizsze srodowisko gracza - a dokladnie takie jakie ma w zasiegu dzialania i ciut wiecej - w zaleznosci od dynamiki zmian. Jesli w drugim koncu lasu pojawil sie jelonek i jakis gosc go zaatakowal - to lokalny gracz dopoki nie podejdzie w zasieg wzorku lub sluchu o tym nie musi wiedziec. Jak podejdzie poznei jto od 1 aktualizacji zobaczy walke, albo cialo jelonka - wszystko co bylo wszesniej nie ma dla niego znaczenia wiec po co to przesylac...
No dość wymądrzania
Andrzej Dąbrowski

0

Kompresja pakietów</url>

0

Dzięki za pomoc [browar] .

Znalazłem BattleFielda 2D, popatrzyłem na jego kod sieciowy i udało mi się zrobić podobny, korzystający z protokołu TCP/IP. Jest tylko jeden problem. Wprawdzie gra działa bardzo dobrze (modem ją nawet udźwignie), gdy klient łączy się z serwerem (nawet w odległości Warszawa-Wrocław), ale gdy klient chce podłączyć się do serwera dedykowanego uruchomionego na tym samym kompie (pod adres IP, jaki ów komputer posiada) to występują powazne błędy w przesyłaniu danych (nie można w ogóle zacząć rozgrywki). Problem nie występuje, gdy wpisuję 127.0.0.1 w trybie offline. Co to znaczy?

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