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