Radzenie sobie z LGD w XNA + lidgren

Eksperymentuję z lidgren w XNA i mam pewne problemy z "lag".

Pobrałem ich próbkę XNA i zauważyłem, że nawet ich próbki pozostają w tyle. Chodzi o to, że ruch nie jest płynny po drugiej stronie i próbuję to na LAN (na tym samym komputerze), a nie przez internet.

Czy ktoś miał takie same problemy w odniesieniu do niezmotliwego ruchu z powodu opóźnionego połączenia z lidgrenem i XNA ?

Author: Jonas, 2010-07-18

2 answers

Próbka, którą bezpośrednio połączyłeś, ustawia pozycję na to, co otrzymuje z sieci, to zły pomysł na grę wieloosobową!

To, co powinieneś zrobić w prawdziwej grze, to interpolować między pozycją lokalną a pozycją zdalną. Więc twoja metoda otrzymywania wyglądałaby trochę tak:

void Receive(packet)
{
    unit.RemoteX = packet.Read_X_Position();
    unit.RemoteY = packet.Read_Y_Position();
}

Nie ma to wpływu na lokalną pozycję urządzenia, zamiast tego w metodzie aktualizacji (każda ramka) przesuwasz lokalną pozycję w kierunku zdalnego sterowania pozycja:

void Interpolate(deltaTime)
{
    difference = unit.RemoteX- unit.LocalX
    if (difference < threshold)
        unit.LocalX = unit.RemoteX
    else
        unit.LocalX += difference * deltaTime * interpolation_constant
}

Następnie wyświetlasz "lokalną" pozycję jednostki, to osiąga ruch bez opóźnień w następujący sposób:

  1. Jeśli jednostka znajduje się prawie na odległej pozycji, przeskoczy do odległej pozycji (jednak przeskoczy tak małą odległość, że nie będzie wyglądać na opóźnioną).
  2. jeśli różnica jest zbyt duża, aby przeskoczyć, przesuń się powoli w kierunku pozycji, w której powinieneś być. stała interpolacji kontroluje, jak szybko zbiegają się lokalne i odległe pozycje. Przy stałej interpolacji zero, Jednostka zignoruje aktualizacje sieci, ze stałą 1 teleportuje się prosto do pozycji sieci (i wygląda laggy) - więc musisz wybrać kompromis gdzieś pomiędzy

Ponieważ urządzenie porusza się płynnie tam, gdzie powinno być, wygląda na to, że nie ma żadnych opóźnień!

Jest kilka innych rzeczy do rozważenia przy wdrażaniu tego rodzaju systemu, na przykład często chcesz górnej granicy, jak daleko od jednostek mogą być od ich odległa pozycja w przeciwnym razie lokalny i odległy stan może stać się" unstuck " w niektórych sytuacjach. Jeśli są zbyt daleko od siebie (co nigdy nie powinno się zdarzyć, z wyjątkiem przypadków ekstremalnych lag) możesz albo zatrzymać grę i powiedzieć użytkownikowi, że jest zbyt laggy, lub przeskoczyć jednostkę prosto na pozycję, która będzie wyglądać laggy, ale przynajmniej gra będzie kontynuowana.

Dodatek: czytając ponownie tę odpowiedź, wydaje mi się, że ulepszeniem byłoby śledzenie różnic czasowych. Jeśli wiesz (z grubsza) co lag jest w systemie, to wiesz, że kiedy otrzymasz pakiet z odległą pozycją w wiesz mniej więcej, jak daleko w przeszłości, że pakiet jest z. Jeśli wyślesz również zdalną prędkość, możesz przewidzieć, gdzie znajduje się obiekt (zakładając stałą prędkość). W niektórych grach może to zmniejszyć różnicę między szacowanym stanem lokalnym a rzeczywistym stanem zdalnym, w innych grach (gdzie masz wiele zmiennych prędkości) może to pogorszyć sytuację.

 31
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-25 12:00:27

Patrzyłem na napisanie gry wieloosobowej fps, zaczynając od dema przesuwania kostek wokół i powielania pozycji / obrotów na innej maszynie, która jest w trybie widza.

Używam powyższej próbki kodu i działa dobrze(musiałem poprawić stałą interpolacji wyższą niż 1, aby wyglądała gładko).

Widziałem kilka przykładów interpolacji, które uwzględniają różnicę czasu między aktualnym czasem a znacznikiem czasu na otrzymałem wiadomość.

Widzę, że ten kod nie wykorzystuje różnicy czasu, więc interpolacja zajmie tyle czasu, ile będzie trzeba, aby dostać się do wartości docelowej (lub przynajmniej w granicach wartości progowej, aby następnie przyciągnąć na pozycję). Moje pytanie brzmi, czy jest w tym jakaś korzyść?

Wielkie dzięki.

 1
Author: Prometheus3k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-11 14:40:12