Autor Wątek: Nieprzewidywalna symulacja fizyki.  (Przeczytany 2455 razy)

Offline C'mons

  • Użytkownik

# Marzec 09, 2009, 20:31:38
Używam box2D i czasem gdy waha się FPS spadając z lekka, również i symulacja spowalnia. Myślałem o jakimś trick'u który obliczałby ile "klatek" symulacji fizyki pominęło względem poprzedniego razu a następnie nadrabiałoby te zaległości. To dobry pomysł? Może ktoś zna inny sposób?

Pozdrawiam.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline DoS

  • Użytkownik
    • Projekt ORC

# Marzec 09, 2009, 20:41:55
Nie symuluj fizyki (ani jakichkolwiek obliczeń) na podstawie FPS. Właśnie z powodu jego niestałości. Licz czas między kolejnymi ramkami, właśnie w tedy nie będą Ci straszne żadne spadki i wzloty FPS :)

Offline C'mons

  • Użytkownik

# Marzec 09, 2009, 23:29:01
Cytuj
Nie symuluj fizyki (ani jakichkolwiek obliczeń) na podstawie FPS. Właśnie z powodu jego niestałości.
Nie robiłem i nie robie tak. :) Jeśli FPS spada to oznacza to, że przez główną pętle programu przechodzi mniejszą ilość razy na sekundę, a co za tym idzie również i funkcja "robiąca" kolejny krok symulacji zostanie rzadziej wywołana na sekundę i to powoduje spowolnienie. Kiedy FPS spada o około 10 jednostek to nie widać znaczącej różnicy ale czasem zawaha się aż o 30 i wtedy powstaje spowolnienie na jakieś 2-3 sekundy a to wygląda nieelegancko.
« Ostatnia zmiana: Marzec 09, 2009, 23:31:23 wysłana przez C'mons »

Offline Radarek

  • Użytkownik

# Marzec 09, 2009, 23:46:25
Przecież to podstawa pisania gier. Logikę symulujesz w miarę stałych odstępach (ale wciąż na podstawie czasu delta t, który upłynął od ostatniej aktualizacji) a grafikę wyświetlasz osobno (to już prezentacja aktualnego stanu logiki). Kolega bardzo dobrze Ci podpowiedział.

Offline djsmtih

  • Użytkownik

# Marzec 09, 2009, 23:46:39
Cytuj
Nie symuluj fizyki (ani jakichkolwiek obliczeń) na podstawie FPS. Właśnie z powodu jego niestałości.
Nie robiłem i nie robie tak. :) Jeśli FPS spada to oznacza to, że przez główną pętle programu przechodzi mniejszą ilość razy na sekundę, a co za tym idzie również i funkcja "robiąca" kolejny krok symulacji zostanie rzadziej wywołana na sekundę i to powoduje spowolnienie. Kiedy FPS spada o około 10 jednostek to nie widać znaczącej różnicy ale czasem zawaha się aż o 30 i wtedy powstaje spowolnienie na jakieś 2-3 sekundy a to wygląda nieelegancko.

Czyli symulujesz fizyke na podstawie FPSu :)

Offline C'mons

  • Użytkownik

# Marzec 10, 2009, 17:33:59
W takim razie źle Ciebie zrozumiałem DoS. Więc logikę gry należy uruchamiać w regularnych odstępach czasu, do tego nadaje się zwykły timer który odlicza chociażby 10 milisekund. Dobrze mówię?

Zrobiłem też mechanizm zapobiegający. Mój system timerów potrafi zwrócić ilość przebiegów przez podany czas od ostatniego sprawdzenia. Wiec sprawdzam dodatkowo czy nie wystąpiło więcej niż jeden przebieg, jak tak to nadrabiam to wywołując logikę gry odpowiednio n-razy.
« Ostatnia zmiana: Marzec 10, 2009, 17:37:54 wysłana przez C'mons »

Offline RedHot

  • Użytkownik

# Marzec 10, 2009, 18:01:35
Byłoby fajnie gdybyś mógł zawsze uruchamiać ją co np. 16 ms ( załóżmy że masz stały FPS na poziomie 60 ) Ale w związku z tym że nie zawsze tak się da, musisz robić to co powiedziano wcześniej - dostosować symulację do czasu. Czyli podajesz jaki czas upłynął i na tej podstawie wszystko obliczasz, a nie zwiększasz ilość wywołań.
« Ostatnia zmiana: Marzec 10, 2009, 21:07:23 wysłana przez RedHot »

Offline C'mons

  • Użytkownik

# Marzec 10, 2009, 19:29:57
Ale aż tak dobrej symulacji jeszcze nie potrzebuje. Przynajmniej nie w aktualnej produkcji. Dziękuje za pomoc.

Offline Kos

  • Użytkownik
    • kos.gd

# Marzec 11, 2009, 12:30:18
Gdy zauważysz któregoś dnia w fizyce bugi z kosmosu (przechodzenie przez ściany przy zaciachach, np), to stwierdzisz, że jednak potrzebujesz. :)

Offline Mattrick

  • Użytkownik

# Marzec 11, 2009, 15:46:19
Poza tym, symulowanie w oparciu o czas jest logiczne i naturalne dla człowieka (w końcu uczą nas tego na fizyce i obserwujemy w realnym świecie). Weźmy na przykład prędkość - np. 10 m/s.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 11, 2009, 15:54:13
Cytuj
Byłoby fajnie gdybyś mógł zawsze uruchamiać ją co np. 16 ms ( załóżmy że masz stały FPS na poziomie 60 ) Ale w związku z tym że nie zawsze tak się da, musisz robić to co powiedziano wcześniej - dostosować symulację do czasu.
Jak to się nie da? Ja u siebie wywołuję symulację fizyki raz na każde 50ms (niezależnie od FPS i delt) i nie mam w związku z tym żadnych problemów. :)

Offline Avaj

  • Użytkownik

# Marzec 11, 2009, 17:28:05
Cytuj
Byłoby fajnie gdybyś mógł zawsze uruchamiać ją co np. 16 ms ( załóżmy że masz stały FPS na poziomie 60 ) Ale w związku z tym że nie zawsze tak się da, musisz robić to co powiedziano wcześniej - dostosować symulację do czasu.
Jak to się nie da? Ja u siebie wywołuję symulację fizyki raz na każde 50ms (niezależnie od FPS i delt) i nie mam w związku z tym żadnych problemów. :)
U ciebie jest co innego, twój silnik zagina czasoprzestrzeń :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 11, 2009, 17:39:20
Cytuj
U ciebie jest co innego, twój silnik zagina czasoprzestrzeń :)
Co nie zmienia faktu, że ten pomysł sprawdza się też w normalnych warunkach. :)

Offline Limal

  • Użytkownik
    • http://wolnik.co.uk

# Marzec 11, 2009, 17:48:52
Krzysiek, a to nie jest tak, że wywołujesz fizykę za każdym razem, gdy czas od ostatnich obliczeń jest dłuższy od 50 ms? A jako argument podajesz jednak deltę (czasem 50 ms, czasem 55 ms)? W końcu system nie może zagwarantować wywołania danej funkcji co 50 ms.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 11, 2009, 18:02:18
Cytuj
Krzysiek, a to nie jest tak, że wywołujesz fizykę za każdym razem, gdy czas od ostatnich obliczeń jest dłuższy od 50 ms?
Jest tak.

Cytuj
A jako argument podajesz jednak deltę (czasem 50 ms, czasem 55 ms)?
Nie jest tak. Fizyka ma stały krok. Te dodatkowe "5ms" jest zaliczane na poczet "czasu  od ostatnich obliczeń". :)