Próbuję wdrożyć system fizyki klient / serwer za pomocą Bullet, ale mam problemy z synchronizacją.
Wdrożyłem niestandardowy stan ruchu, który odczytuje i zapisuje transformację z moich obiektów gry i działa lokalnie, ale wypróbowałem dwa różne podejścia do gier sieciowych:
- Dynamiczne obiekty na kliencie, które również znajdują się na serwerze (np. Nie losowe śmieci i inne nieistotne rzeczy) są kinematyczne. Działa to poprawnie, ale obiekty nie poruszają się bardzo płynnie
- Obiekty są dynamiczne na obu, ale po każdej wiadomości z serwera, że obiekt został przeniesiony, ustawiam prędkość liniową i kątową na wartości z serwera i wywołuję btRigidBody :: progressToTransform z transformacją na serwerze. Wywołuję także btCollisionObject :: Activate (true); aby wymusić aktualizację obiektu.
Moim zamiarem przy metodzie 2 było w zasadzie wykonanie metody 1, ale przejęcie Bulleta w celu wykonania prognozy biedaka zamiast zrobienia własnej w celu wygładzenia metody 1, ale wydaje się, że to nie działa (z powodów, które nie są w 100% jasne ja nawet przechodząc przez Bullet), a obiekty czasami trafiają w różne miejsca.
Czy zmierzam we właściwym kierunku? Wydaje się, że Bullet ma wbudowany własny kod interpolacji. Czy to może mi pomóc ulepszyć metodę 1? A może mój kod metody 2 nie działa, ponieważ przypadkowo go depczę?
EDYCJA: Innym problemem z metodą 1, którą właśnie zauważyłem, jest to, że odpowiedź na kolizję będzie daleka od kolizji z niezsynchronizowanymi obiektami. Ciała kinetyczne czasami strzelają do nieskończoności, ponieważ nie można ich odrzucić.
Odpowiedzi:
Potrzebujesz odpowiedniej prognozy po stronie klienta .
Naprawdę powinieneś przeczytać szczegółowo link Roy T. podany w jego komentarzu . Opisuje, co zrobić z wkładem gracza i fizyką postaci, ale zasada pozostaje taka sama w przypadku „fizyki opartej na serwerze”.
Nie jest to łatwe do zaimplementowania, ale w kilku słowach, w przypadku obiektów gry, które muszą być zsynchronizowane:
Więc tak, podążasz we właściwym kierunku swoją metodą 2. Jednak po prostu nadpisanie wartości nie wystarczy, dostaniesz skoki na kliencie, to, co musisz zrobić, to płynnie i stale interpolować do wartości serwera.
Jeśli chodzi o rzeczywisty błąd, nie znam Bulleta, ale prawdopodobnie brakuje niektórych wartości, np. Ustawiłeś prędkości liniowe i kątowe, ale czy ustawiłeś przyspieszenia?
źródło
To, co robię osobiście, to ten, kto hostuje grę, tworzy świat fizyki i synchronizuje obiekty z klientami. Nawet jeśli jest to schemat sieci p2p, nadal opieram silnik fizyki na jednym z klientów odtwarzacza.
Inna fizyka, której używam, a która to czysta słodycze, nawet nie wymaga synchronizacji.
W prototypie, który wykonałem jakiś czas temu, zwanym „boilerzerker”, prowadziłem fizykę na hoście, a efekty cząsteczkowe (również przy użyciu fizyki) nie były synchronizowane w sieci, ale były niezależne dla każdego klienta, ponieważ były słodyczami.
źródło
Niemożliwe jest wdrożenie synchronicznych sieciowych światów fizyki. Mała różnica w kroku N Oczywiście znacznie większa różnica w kroku N + 1 Nie można przyłożyć sił ani impulsów, aby zachować synchronizację i wyglądać realistycznie.
Rozwiązania:-
Możesz rozważyć zsynchronizowanie tylko kilku obiektów, takich jak postacie lub samochody wyścigowe, szczególnie jeśli są one kinematyczne. Ale większość świata nie byłaby zsynchronizowana, żeby wyglądać realistycznie.
Możesz mieć jeden świat fizyki na serwerze i przekazywać pozycje i prędkości obiektów klientom.
źródło