Lopez Opublikowano 6 Czerwca 2010 Udostępnij Opublikowano 6 Czerwca 2010 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 Więcej opcji udostępniania...
Tymon Opublikowano 6 Czerwca 2010 Udostępnij Opublikowano 6 Czerwca 2010 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 Więcej opcji udostępniania...
wikku9 Opublikowano 6 Czerwca 2010 Udostępnij Opublikowano 6 Czerwca 2010 przesyłaj vspeed zamiast y bo podczas skoku może się zawieszać Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 6 Czerwca 2010 Udostępnij Opublikowano 6 Czerwca 2010 Zawsze też możesz przesyłać tylko różnicę pozycji, znaczy wektor przemieszczenia. To też zmniejsza rozmiar pakietu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
MagnusArias Opublikowano 6 Czerwca 2010 Udostępnij Opublikowano 6 Czerwca 2010 wikku: hspeed - horizontal (pozioma) vspeed - veritcal (pionowa) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Lopez Opublikowano 6 Czerwca 2010 Autor Udostępnij Opublikowano 6 Czerwca 2010 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 6 Czerwca 2010 Udostępnij Opublikowano 6 Czerwca 2010 Tylko nie zapomnij co jakiś czas wysłać bezwzględnej pozycji, bo zgubi się jakiś pakiecik i dupa. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 6 Czerwca 2010 Udostępnij Opublikowano 6 Czerwca 2010 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 Więcej opcji udostępniania...
Dacus Opublikowano 6 Czerwca 2010 Udostępnij Opublikowano 6 Czerwca 2010 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 Więcej opcji udostępniania...
pablo1517 Opublikowano 24 Czerwca 2010 Udostępnij Opublikowano 24 Czerwca 2010 @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 Więcej opcji udostępniania...
Dacus Opublikowano 24 Czerwca 2010 Udostępnij Opublikowano 24 Czerwca 2010 @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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 6 Lipca 2010 Udostępnij Opublikowano 6 Lipca 2010 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę