Jaka jest różnica między aktualizacją a FixedUpdate w Unity i czy powinienem się tym przejmować?


10

Kazano mi używać Update()grafiki i FixedUpdate()fizyki, ale czasami moje dane wejściowe nie rejestrują się, gdy używam FixedUpdate(). Działa dobrze, jeśli używam Update()do wszystkiego.

Czy powinienem zawracać sobie głowę FixedUpdate(), czy robię coś złego?

Odpowiedzi:


10

FixedUpdatemoże działać szybciej lub wolniej niż w Updatezależności od ustawień. Będzie to zależeć od obciążenia (szybkości Updatebiegu) i prędkości, którą ustawiłeś FixedUpdate(znajduje się w Edycja-> Ustawienia projektu-> Czas). Idealnie, ponieważ Updatejest uruchamiany raz na klatkę, tutaj chcesz przechwycić dane wejściowe. Jeśli musisz działać na podstawie danych wejściowych w FixedUpdatemetodzie (takich jak kontrolowanie ciał fizycznych), ustaw flagi, Updatea następnie obsłuż je FixedUpdate:

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

Nadal dobrym pomysłem jest sterowanie fizyką za pomocą tej FixedUpdatemetody, ponieważ jest mało prawdopodobne, że fizyka musi być aktualizowana tak często, a fizyka przy stałej aktualizacji jest znacznie łatwiejsza do przewidzenia ( determinizm ) niż fizyka przy zmiennej aktualizacji.


co jeśli zamiast warunku bool (es.GetMouseButtonDown) musimy odczytać wartość z osi (Input.GetAxis („Horizontal”))? Jeśli aktualizacja jest wykonywana więcej razy niż FixedUpdate, jaka jest Twoja rada w takim przypadku? Czy powinniśmy w końcu rozważyć obliczenie średniej wartości osi występującej podczas kilku aktualizacji, zanim wykorzystamy ją do aktualizacji? (+1 btw)
Heisenbug

Jak mogę dowiedzieć się, jak szybka jest moja FixedUpdate?
Tokamocha,

1
@Tokamocha Szybkość stałej aktualizacji jest ustawiona w Edycja-> Ustawienia projektu-> Czas.
MichaelHouse

@ Heisenbug Osobiście chciałbym użyć ostatniej wartości i zobaczyć, jak dobrze to działa. Jeśli otrzymam nieoczekiwane wyniki, mogę obliczyć średnią bieżącą wartości osi, dopóki nie zostanie ona przetworzona FixedUpdate. Jest to jedna z tych rzeczy, które wymagają testów gry, aby naprawdę dowiedzieć się, co „czuje się” dobrze.
MichaelHouse

1
Odkryłem w ostatnich testach, że w przeciwieństwie do tego, co sugerują dokumenty, świeże flagi wejściowe są już dostępne w FixedUpdate (przynajmniej na PC). Tak więc ustawienie flagi w Aktualizacji, a następnie działanie na niej w następnej FixedUpdate później (tj. W następnej ramce), jak pokazano tutaj, może faktycznie dodać ramkę opóźnienia w grze, w odniesieniu do bezpośredniego wprowadzania danych w FixedUpdate. Wymaga to jednak pewnej uwagi, aby uniknąć podwójnego wprowadzania danych w ramkach z wieloma FixedUpdates lub brakujących danych w ramkach bez FixedUpdate.
DMGregory

7

Musisz zrozumieć, co każdy z nich robi. Update()jest wywoływany tak często, jak to możliwe (nie jestem pewien, może można go ograniczyć), w obu przypadkach - każda klatka. FixedUpdate()jest wywoływany co stałą ilość czasu (stąd „ustalony”).

Wejście wchodzi w Update()tak proste (ponieważ, jak zauważyłeś, FixedUpdate()może nie złapać zdarzenia wejściowego). Logika gry może się jednak przydać. Fizyka musi być deterministyczna i dlatego powinna być FixedUpdate(). Inne rzeczy nie muszą. W zależności od zastosowania musisz zdecydować, która funkcja jest odpowiednia.

W Althouth warto powiedzieć, że niektóre aplikacje mają zaktualizowaną logikę gry FixedUpdate()(nawet poza nią Unity) - nazywa się to „stałą pętlą gry”. Posiadanie całego kodu aktualizacji w funkcji stałego kroku daje determinizm i sprawia, że ​​aplikacja zachowuje się tak samo za każdym razem (i na każdym urządzeniu). Pozwala również na niektóre fantazyjne funkcje, takie jak powtórki.


Więc jeśli włożę wszystko do FixedUpdate (), moja gra nadal zarejestruje wszystkie dane wejściowe, prawda?
Tokamocha,

1
Nie, możesz umieścić tam całą aktualizację logiki gry, ale nie sprawdzać danych wejściowych.
NPS

2
ta odpowiedź jest pełna brakujących informacji. Przede wszystkim FixedUpdate jest nazywany 1 / fixedDeltaTime razy na sekundę , a nie co n: th fixedDeltaTime. Po drugie, logika gry powinna zawsze wchodzić w FixedUpdate, ponieważ ułatwia to rozumowanie. Aktualizacja służy wyłącznie do renderowania (wiem, że prawie nikt w społeczności Unity nie podąża za tym, ale tak naprawdę należy to zrobić). Po trzecie, FixedUpdate i jego związek z silnikiem fizyki nie ma nic wspólnego z determinizmem.
thr
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.