Skocz do zawartości

Efektywne przesyłanie pozycji przez sieć w wyjątkowych układach


Exigo

Rekomendowane odpowiedzi

Najpierw napiszę o co mi chodzi. ; )

Jeśli założymy, że przemieszczamy obiekt w układzie który nie jest w stanie wpłynąć na zmianę pozycji. Najprostszym przesyłaniem danych będzie zwykły "input-output", gdzie filozofią będzie przewidywanie ruchów na serwerze. W grę wchodzi tylko TCP, a dane są zawsze bezbłędne na wszystkich klientach. Proste jak flaki z olejem.

Ale do tego tematu trzeba podejść inaczej, jeśli układ w którym jest nasz obiekt, może czasami losowo (lub na pewnych, ale nadal nieprzewidywalnych zasadach) na niego wpłynąć. Wtedy powyższy pomysł input-output zwyczajnie odpada. Prostszym rozwiązaniem jest wtedy mityczne przesyłanie pozycji, i mamy to z głowy. Tylko że jeśli przesyłamy dwa shorty co klatkę, rozmyślamy się bo wiemy że to za dużo, i kombinujemy dalej.

 

Jakiś pomysł? Moje zasady obiektu (jakie przychodzą mi do głowy) są dwie:

- przemieszcza się w układzie o szerokości i wysokości shorta (czyli od -32768 do 32767).

- co stepa maksymalnie może przemieścić się w polu koła o promieniu od 0 do 255, i o kącie od 0 do 360 (kąt możemy przekształcić na zakres byte (0-255), dzieląc przez 1,4). (Przemieszczenie możemy też opisać wektorowo, odejmując nową pozycję od starej. Uzyskamy to samo, ale w polu kwadrata o szerokości 255x255. Bardziej odpowiadającym tym wymaganiom będzie jednak pierwszy sposób, w kole, ze wzg. na sposób poruszania (trygonometryczny)).

 

To co wymyśliłem to:

- Jeśli nastąpi jakiekolwiek przemieszczenie, przesyłam trzy wartości (np. co 2 klatki), gdzie pierwsza to identyfikator (bajt mówiący jakie są dalsze bity), druga (bajt) to długość, trzecia (bajt) to kąt.

- Co parę sekund przesyłam pozycje korygujące, czyli identyfikator paczki i dwa shorty (x i y).

Wektory są obsługiwane w ten sposób, że co stepa aktualizują przemieszczenie, nawet jeśli gracz nie przesyła żadnych danych - w pewnym sensie "przewiduje" jego drogę, bo wiadomo że się przemieszcza.

 

Wszystko jest przesyłane w miarę szybko, ale nie za dokładnie. Często skacze. Zakładam, że ktoś już miał kontakt z podobną tematyką i problemami, dlatego też jeśli macie jakieś pomysły lub pisaliście jakąś sieciówkę, podzielcie się doświadczeniem, proszę. :)

Odnośnik do komentarza
Udostępnij na innych stronach

Tak, to jest układ w kwadracie o czym ty mówisz. Już o tym napisałem. ; ) Zostaję jednak przy kierunku i długości, ze względu na sposób poruszania. Porównując pole kwadratu do koła, ok, masz to samo. Tylko że pierwotna opcja pasuje bardziej ze względu na sposób poruszania (hm, jak by to powiedzieć: "lengthdirowo"), czyli w kwadracie obszary skrajnie odległe jak rogi by nie byłyby wykorzystywane. Poza tym nie muszę tego przeliczać, tylko od razu mam gotowe do przypisania dane.

Odnośnik do komentarza
Udostępnij na innych stronach

Tzn. przedstawię to w inny sposób, bardziej praktycznie obrazując: Jak napisalibyście przesyłanie pozycji za pomocą 39dll postaci znajdującej się w układzie pełnym skrzynek zintegrowanych z silnikiem fizycznym. :)

A tak po za głównym wątkiem, mamy bajta, czyli całkowite od 0 do 255. Jak zapisać do niego binarnie dwie wartości o zakresie 0-128?

Odnośnik do komentarza
Udostępnij na innych stronach

Do każdego klawisza dałbym funkcję przesyłającą ID wciśniętego/puszczonego klawisza. Na serwerze do każdego ID klawisza przypisałbym skrypt wykonywany przy naciśniętym/puszczonym klawiszu. I tak po naciśnięciu Left Arrow postać rusza się w lewo, po naciśnięciu Left Mouse Button postać strzela itd.

 

Nie próbowałem nigdy takiego (ani innego : /) sposobu, słyszałem też, że są przy nim spore opóźnienia. Niemniej - staram się pomóc, poza tym wydaje mi się, że przy pomocy synchronizacji mogłoby nawet wypalić.

Odnośnik do komentarza
Udostępnij na innych stronach

mamy bajta, czyli całkowite od 0 do 255. Jak zapisać do niego binarnie dwie wartości o zakresie 0-128?
0-255 = 8 bitów, 0-127 = 7 bitów. 14 bitów ewidentnie nie zmieści się w ośmiu : p

Zmieścisz dwie wartości 0-15, i zapis:

 

liczba = (a << 4) + b;

 

Odczyt:

a = liczba >> 4;

b = liczba mod 16;

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...