Czy powinienem napisać własny silnik fizyki z powodu integracji sieci?

11

Obecnie pracuję nad odgórną strzelanką zombie w czasie rzeczywistym. Piszę to w Javie, używając JBox2D jako mojego silnika fizyki. W tym tygodniu kodowałem sieć i jestem teraz gotowy do synchronizacji fizyki.

Planuję użyć predykcyjnego modelu klient / serwer autorytatywny, w którym klient może się swobodnie poruszać, o ile serwer zaakceptuje go później. Wiąże się to z wysłaniem przez klienta pakietów zawierających dane o ruchu do serwera oraz obliczeniem opóźnienia i ponownym symulowaniem świata ze starszego stanu.

Mój problem polega na tym, że mój obecny silnik fizyki, JBox2D (w zasadzie port Box2D), nie obsługuje cofania świata i najwyraźniej nie jest tak łatwo serializować światowe dane. Mam 2 rozwiązania, mogę albo zmodyfikować / rozszerzyć mój obecny silnik fizyki, albo napisać własny.

Powody, dla których napisałem własny silnik fizyki -

  • Mogę usunąć niepotrzebne funkcje. W odgórnej grze potrzebuję tylko mechaniki kolizji i sił manipulacyjnych. Nie dotyczy to grawitacji.
  • Mogę lepiej zrozumieć kod i [najprawdopodobniej] łatwiej byłoby zaimplementować funkcje przywracania

Powody rozszerzenia / modyfikacji JBox2D

  • Pisanie własnego silnika fizyki wymagałoby dużo pracy, co może być kłopotliwe
  • JBox2D ma bardzo wspierającą społeczność, która może mi pomóc z moim twórcą
  • JBox2D ma specyficzne optymalizacje, takie jak wykrywanie kolizji, co czyni go użytecznym
  • Niektóre prace zostały już wykonane, ale udostępniono niewiele kodu

Jakie są twoje opinie? To moja pierwsza gra i nie jestem profesjonalnym twórcą gier. Jeśli ktoś może podać linki do pracy już wykonanej w tym obszarze (najlepiej używając JBox2D / Box2D / Java).

liamzebedee
źródło
Pamiętaj również, że jeśli używasz JBox2D, będziesz musiał używać go strictfpwszędzie, co poważnie wpłynie na wydajność. W przeciwnym razie serwer i klient mogą nie uzyskać dokładnie takich samych wyników. Poleciłbym zamiast tego użyć stałego punktu.
sam hocevar,

Odpowiedzi:

7

Wykrywanie kolizji w 2D jest tak cholernie proste, że nie wiem, dlaczego w ogóle zawracasz sobie głowę używaniem silnika fizyki. A ponieważ wszystkie siły manipulacji są proste lub na zakręcie (bez spadania, zmieniania diagnoz itp.) Osobiście nie zastanawiam się, które powinieneś wybrać. Tworzenie własnych jest proste. Kolizja:

uwzględnij 3 możliwe kolizje, które mogą wystąpić w 2 prostokątach:

  1. Od krawędzi do krawędzi: dość prosta, dostajesz oś jednej krawędzi, a drugą i decydujesz, czy zajmują one to samo miejsce, czy wystarczająco blisko niego.
  2. Od krawędzi do rogu: z łatwością będzie to najczęściej występujące w przypadku obracania kształtów. Na szczęście jest również dość prosty do wdrożenia.
  3. Narożnik: zdarza się tak rzadko, że nawet nie warto go wdrażać. Powodem tego jest to, że 2 rzeczy musiałyby się poruszać w dokładnie przeciwnych kierunkach na tej samej dokładnej osi w dół do ostatnich obliczonych miejsc dziesiętnych silników. Teraz, jeśli wszystko obraca się o 45 lub 90 stopni, to MAJ (nawet prawdopodobnie prawdopodobnie nie) będzie tego warte

EDYCJA: Jak skomentowałem, jestem o wiele mniej zaznajomiony z tą sprawą i nie powinienem się konsultować w sprawie kolizji pocisku / pocisku.

Kiedy pracowałem z pociskami w przestrzeni 2D, zastosowałem rodzaj ścieżki, która działała zarówno w linii prostej, jak i zakrzywionej, w której rzuciłem pocisk za pomocą silnika fizyki (którego nie zrobiłem od zera) i użyłem standardowej kolizji.

Przeczytaj o budowaniu tego od zera w komentarzach.


EDYCJA: * Zaufaj mi, * niezależnie od tego, będziesz potrzebować jakiejś formy martwego liczenia w silniku gry, ze względu na pociski i liczbę pocisków, które mogą być na ekranie w danym momencie. ABSOLUTNIE NIE chcesz aktualizować każdej kuli na ekranie dla każdej klatki w podanej lokalizacji. Jest to jednak świetny sposób na spowolnienie gry: D! Powinieneś zawsze aktualizować tylko te rzeczy:

  • Rzucany jest pocisk
  • Kierunek, w który jest rzucany
  • Czy jest zakrzywiony czy nie
    • A jeśli tak, jaka jest funkcja krzywej
  • Co to jest pocisk (dotyczy grafiki, efektów, uszkodzeń, wszystkiego)

Teraz zaktualizuj dane w silniku zgodnie z tymi danymi, a nie na serwerze dla każdego cholernego pocisku, i wysyłaj dane pakietowe dla każdego pocisku. (Wyobraź sobie, że robisz to z zaledwie 2 karabinami maszynowymi na ekranie! Jezu!)

Joshua Hedges
źródło
Oczywiście jest stosunkowo łatwa do wdrożenia, ale interesuje mnie również optymalizacja wykrywania kolizji, której nie mam pojęcia jak zaimplementować.
liamzebedee,
Metoda, którą opisałem, naprawdę nie będzie wymagała optymalizacji, jeśli zrobisz to zgodnie z opisem. Jedyną optymalizacją, która może być potrzebna, jest czas przeprowadzenia kontroli i częstotliwość faktycznych aktualizacji kolizji. Np .: NAPRAWDĘ wymagają aktualizacji tylko wtedy, gdy istnieje możliwość kolizji.
Joshua Hedges,
Aby rozwinąć to, co ostatnio powiedziałem. Naprawdę musisz tylko sprawdzić, czy nie ma kolizji budynku, na przykład gdy twoja postać porusza się w pierwszej kolejności. Musisz tylko sprawdzić, czy nie ma kolizji jednostek, nawet jeśli masz w widoku jednostki, które nie są twoją postacią. Musisz tylko sprawdzić, czy nie ma kolizji pocisków, jeśli nawet one istnieją (w tym momencie). Możesz pominąć dowolną formę wykrywania typu kolizji (czy to krawędź do krawędzi? Narożnik do krawędzi itp.), Gdy wiesz, że coś dotyka czegoś innego lub jest blisko niego. W przeciwnym razie pomiń to ogólnie.
Joshua Hedges
Z wyjątkiem sytuacji, gdy przetwarzam kolizje po stronie serwera, w których muszę wykrywać kolizje dla wielu graczy itp.
liamzebedee
4
@MadPumpkin: twoja nadmierna pewność siebie źle odzwierciedla twoją odpowiedź; mówisz o wykrywaniu kolizji, ale nie wspominasz o wykrywaniu kolizji wymiatających, które jest absolutnym rdzeniem prawidłowej obsługi pocisków w strzelance 2D. Również, nawet przy wymiataniu, rozdzielczość jest równie ważna jak wykrywanie, ponieważ musisz zdecydować, która kolizja nastąpiła jako pierwsza, rozwiązać potencjalne konflikty i być może rozpocząć całą rozdzielczość ponownie w przypadku usuniętych elementów. Z pewnością nie jest to trywialna sprawa, na którą się wydaje.
sam hocevar,