Autor Wątek: Delta time vs. Fixed Time Step  (Przeczytany 3085 razy)

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Lipiec 31, 2011, 21:06:01
Poczytałem sobie trochę tu i tu o różnych metodach aktualizacji czasu. Bardzo często spotykam jednak dt, mimo tego, że występują z nią jakieś artefakty typu wpadnie pod textury etc.. Jednak w timer w bibliotece allegro 4.2 o ile mnie pamięć nie myli wykorzystuje fixed step'a, który też nie jest taki święty, bo trzeba interpolować sobie wartości czasu z wartościami renderu, bo same się nie zgrają (o ile dobrze zrozumiałem artykuł na gafferongames.com).

Właściwie do końca nie rozumiem mankamentu dt. Pseudokod:

vector pos,lastpos;
void update()
{
     lastpos = pos;
    pos = velocity * dt;  // OK - dt wynosi 20 a nie tak jak średnio ok 0.003, więc wyleciałaby nam postać w kosmos
    if(collides()) pos = lastpos; // ale tak łatwo się przed tym uchronić
}
Tak więc co jest lepsze? FTS czy DT? Czy na prawdę opłaca się wprowadzać FTS do projektu, i na nim opierać fizykę? Co stosujecie wy, i jakim kosztem?


Offline Mr. Spam

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

Offline MrKaktus

  • Użytkownik

# Lipiec 31, 2011, 21:31:17
Mnie np. zastanawia czy da sie wogole oprzec projekt wielowatkowy o FTS, DT wydaje sie najsensowniejsze i intuicyjne w takiej sytuacji.

Offline Xirdus

  • Redaktor

# Lipiec 31, 2011, 21:33:59
W fixed timestep też wykorzystuje się dt - tyle że wartość ta jest stała.

OK - dt wynosi 20 a nie tak jak średnio ok 0.003, więc wyleciałaby nam postać w kosmos
ale tak łatwo się przed tym uchronić

     a       X    b     
X to przeszkoda nie do przejścia.
Co zrobisz, gdy ludzik w jednej klatce przesunie się z a do b?

Offline Moriquendi

  • Użytkownik

# Lipiec 31, 2011, 21:46:57
Cytuj
     a       X    b     
X to przeszkoda nie do przejścia.
Co zrobisz, gdy ludzik w jednej klatce przesunie się z a do b?

ja robię tak, że trzymam poprzednią pozycje gracza i obecną.

Z pozycji poprzedniej i obecnej tworzymy prostą.
Jeżeli prosta przecina jakiś obiekt nie do przejścia to cofamy gracza do poprzedniej pozycji....


Rozwiązanie na pewno nie jest idealne,  bo bohater po jakiejś krzywej może się poruszać etc. ale mi to w platformówce wystarczyło.

Offline Xirdus

  • Redaktor

# Lipiec 31, 2011, 22:08:43
Wiedziałem że padnie takie rozwiązanie problemu ;) I wiem, że jak zapytam "I gracz zostanie dalej metr od ściany, co?" to ktoś napisze by znaleźć takie miejsce na tym odcinku by postać była najbliżej ściany ale nie kolidowała. Jest to rozwiązanie, ale kosztowne obliczeniowo, i trudniejsze w implementacji od fixed timestep.

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Lipiec 31, 2011, 22:36:34
@Xidrus

Fakt, przy ciałach poruszających się dużą szybkością dt może być... wadliwa. Ale to są sytuacje anormalistyczne. Czyli dt musi być nagle zwiększona o dużo(np. przy zawieszce systemu) żeby w ogóle zaistniała. A wystarczy ją poprawić wtedy np if(dt > 0.1) dt = 0; I stracimy 1 klatkę obliczeń. IMHO

wybaczcie polszczyznę, ale wyłączył mi się słownik o tej godzinie... :}

Offline yarpen

  • Użytkownik

# Lipiec 31, 2011, 23:03:44
Fixed timestep ma ta zalete, ze jest deterministyczny, latwiej robic replaye itd. Dodatkowo, banalne jest zaimplementowanie 'przewijania' ramke po ramce (przy zapauzowanej grze) - bezcenne przy debuggowaniu.

Offline Xirdus

  • Redaktor

# Sierpień 01, 2011, 01:44:58
Ale to są sytuacje anormalistyczne. Czyli dt musi być nagle zwiększona o dużo(np. przy zawieszce systemu) żeby w ogóle zaistniała.
Nie jest to aż tak rzadkie zjawisko ;)

A wystarczy ją poprawić wtedy np if(dt > 0.1) dt = 0; I stracimy 1 klatkę obliczeń.
Tracąc przy tym inputa i rozsynchronizowując multiplayera...

Offline Oti

  • Użytkownik

# Sierpień 01, 2011, 03:50:37
Ale to są sytuacje anormalistyczne. Czyli dt musi być nagle zwiększona o dużo(np. przy zawieszce systemu) żeby w ogóle zaistniała.
Nie musi być nagle zwiększona o dużo, wystarczy, że po prostu JEST duża. Np. kiedy gracz ma słabszy komputer i gra mu zwyczajnie muli. To był mój problem podczas pisania w allegro na procku 1ghz. :)

Offline jorul

  • Użytkownik

# Sierpień 01, 2011, 05:01:54
Cytuj
A wystarczy ją poprawić wtedy np if(dt > 0.1) dt = 0;

To nie lepiej zrobić if(dt > 0.1) dt = 0.1? Wtedy masz to Semi-fixed z drugiego artykułu podlinkowanego przez Ciebie w pierwszym poście.

Offline Liosan

  • Redaktor

# Sierpień 01, 2011, 09:07:42
Mnie np. zastanawia czy da sie wogole oprzec projekt wielowatkowy o FTS, DT wydaje sie najsensowniejsze i intuicyjne w takiej sytuacji.
Dlaczego wielowątkowość coś tutaj zmienia?

Liosan

Offline MrKaktus

  • Użytkownik

# Sierpień 01, 2011, 10:06:36
Jeżeli mamy jeden wątek i wszystko sie kisi krok po kroku FTS wydaje sie prosty, gdy mamy wiele watkow na ktorych zad wykonuje sie asynchronicznie FTs wydaje mi sie jakims kosmosem ( a przynajmniej calkowitym zaprzeczeniem asynchronicznosci ).

Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 01, 2011, 10:09:28
A da się mieć w ogóle asynchroniczność w "odtwarzalnej" grze?

Offline Ivian

  • Użytkownik
    • Ivian's Cave

# Sierpień 01, 2011, 14:31:09
No ok. Chcemy "odtwarzać" grę - np. Icy Tower. Spoko. Potrzebny FTS. Ale nie wiem czemu w rpgach czy grach wyścigowych robi to taką wielką różnicę?

Offline Xirdus

  • Redaktor

# Sierpień 01, 2011, 14:37:09
W grach wyścigowych też są replaye. W RPGach rzeczywiście może to nie mieć znaczenia.