Skocz do zawartości

Najbardziej optymalny przesył pozycji


Lopez

Rekomendowane odpowiedzi

Witam ponownie. Chciałbym się poradzić osób bardziej doświadczonych w dziedzinie komunikacji serwer - klient.

 

Jestem na etapie optymalizowania przesyłu danych z klienta na serwer.

Na dzień dzisiejszy wysyłam pozycję x oraz y tylko wtedy, gdy ulegną one zmianie.

 

Czy jest sposób na wysyłanie danych jeszcze optymalniejszym sposobem?

Całość dotyczy projektu gry platformowej, gdzie pozycja gracza zmieniać się może niezależnie od tego, czy gracz użył klawiszy kierunkowych.

 

Pozdrawiam.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie znam całości, więc jedyne co mogę doradzić: dobierz odpowiedni rodzaj pakietu do przesyłanej informacji. Jeśli pozycja obiektu jest z zakresu 0-65535 użyj po prostu 2 bajtów, a jeśli 0-255 to jednego.

Odnośnik do komentarza
Udostępnij na innych stronach

W sumie jeszcze polecam używać ostatniego bitu w bajcie do określania długości liczby, coś takiego w MIDI zostało zastosowane ( variable length value ).

GML (IntToVLV)
n = argument0;

s = '';

while( true )

{

b = n & $7F;

n = n >> 7;

if( n > 0 )

b = b | $80;

s += chr( b );

if( n <= 0 )

break;

}

return s;

GML (VLVToInt)
s = argument0;

n = 0;

for( i = 0; i < string_length( s ); i += 1 )

{

b = ord( string_char_at( s, i + 1 ) );

n = n | ( ( b & $7F ) << ( 7 * i ) );

if( !( b & $80 ) )

break;

}

return n;

I na przykład liczby z zakresu 0-127 masz automatycznie w 1 bajcie, 0-16383 w 2, a 0-2097151 w 3... itd.

 

To tylko przykładowe scripty, tak byś zrozumiał zasadę działania. Można tu by było jeszcze poświęcić bit na określenie znaku liczby.

 

EDIT

Tak, wiem, że nikt tego nie rozumie, ale jednak nadzieja pozostaje.

Odnośnik do komentarza
Udostępnij na innych stronach

Czy jest sposób na wysyłanie danych jeszcze optymalniejszym sposobem?

Całość dotyczy projektu gry platformowej, gdzie pozycja gracza zmieniać się może niezależnie od tego, czy gracz użył klawiszy kierunkowych.

 

Pozdrawiam.

 

Rozumiem że serwer twojej gry nie kontroluje całości fizyki w grze, gdzie klient tylko przekazuje dane z kontrolera i wyświetla grafikę na podstawie danych zwróconych.

 

Jeżeli tak, to możesz przesyłać przyciśnięcia klawiszy, ale każdy inny ruch musisz potraktować jako takie samo zdarzenie. Dla serwera będzie bez różnicy co powoduje ruch postaci. Oczywiście co pewien czas musi być też synchronizacja pozycji.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

@UP sposób bez sensu.

Gracz będzie wyraźnie czuł opóźnienie w reakcji postaci na nacisniecia klawiszy.

 

Ja w Mario Brawl Online miałem taki sposób, że:

GML
speed=DystansPunktowy( PoprzednieX, PoprzednieY, NoweX, NoweY) / 2

direction=KierunekPunktowy( PoprzednieX, PoprzednieY, NoweX, NoweY)

Taki pseudokodzik.

 

I wysyłałem pozycję co drugą klatkę gry.

 

Aczkolwiek robiąc nową grę sposób ten wydawał mi się zbyt mało dokładny. Postaci wędrowały na swoje miejsce z lekkim opóźnieniem.

Polecam wysyłanie aktualnej pozycji oraz kierunku i prędkości w jakim postać aktualnie się przesuwa. Wtedy opóźnienie jest praktycznie nie do zauważenia.

Coś na zasadzie wysyłania vspeed i hspeed, tyle, że ja tych zmiennych nie używam.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

To pokaż swoją grę online, a ja pokażę swoją ;>?

 

Eksperymentowałem przy MBO z najróżniejszymi sposobami synchronizacji postaci, i przesyłanie samych "przyciśniętych" klawiszy to był najgorszy sposób jaki może być. Nawet przy dosyłaniu pakietu "kontrolnego" co sekundę, powstawały desynci.

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ę...