Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

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.

Opublikowano

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.

Opublikowano

Zawsze też możesz przesyłać tylko różnicę pozycji, znaczy wektor przemieszczenia. To też zmniejsza rozmiar pakietu.

Opublikowano

Właśnie, zapomniałem o możliwości przesyłania różnicy pozycji ( Tymon, piwo dla Ciebie ).

 

Pozdrawiam!

 

EDIT: Jeżeli ktoś zna ciekawsze rozwiązanie, czekam na dalsze odpowiedzi.

Opublikowano

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.

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

  • 3 tygodnie później...
Opublikowano

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

Opublikowano

@UP Bez sensu. Jakie opóźnienie? Klient może poruszać postacią sam, a nie czekać na odpowiedź z serwera. Więc czym różni się niby ten sposób od twojego? Poza tym, że mój przesyła mniej danych.

  • 2 tygodnie później...
Opublikowano

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.

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