Яка різниця між Update і FixedUpdate в Unity, і чи варто мені турбуватися?


10

Мені сказали використовувати Update()для графіки та FixedUpdate()фізики, але іноді мої дані не реєструються, коли я використовую FixedUpdate(). Це добре працює, якщо я використовую Update()для всього, хоча.

Чи варто мені турбуватися FixedUpdate(), чи я роблю щось не так?

Відповіді:


10

FixedUpdateможе працювати швидше або повільніше, ніж Updateзалежно від ваших налаштувань. Це залежатиме від завантаження (як швидко Updateпрацює) та швидкості, яку ви встановили FixedUpdate(знайдено в меню Правка-> Налаштування проекту-> Час). В ідеалі, оскільки Updateвиконується один раз на кадр, саме тут ви хочете ввести вхід. Якщо вам потрібно діяти на вході в FixedUpdateметод (наприклад, керуючи фізичними органами), встановіть прапори, Updateа потім обробіть їх у FixedUpdate:

bool leftMouseDown = false;

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

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

Це все ще гарна ідея контролювати фізику за допомогою FixedUpdateметоду, оскільки навряд чи фізику потрібно оновлювати так часто, а фізику за фіксованим оновленням набагато простіше передбачити ( детермінізм ), ніж фізику за змінним оновленням.


що робити, якщо замість умови bool (es.GetMouseButtonDown) нам потрібно прочитати значення з осі (Input.GetAxis ("Горизонтальна"))? Якщо оновлення виконується більше разів, ніж FixedUpdate, яка порада у цьому випадку? Чи слід врешті-решт розглянути підрахунок середнього значення осі, що виникає під час декількох оновлень, перш ніж споживати її в оновлення? (+1 btw)
Heisenbug

Як дізнатися, наскільки швидко відбувається моє оновлення FixedUpdate?
Токамоча

1
@Tokamocha Швидкість для фіксованого оновлення встановлюється в меню Правка-> Налаштування проекту-> Час.
MichaelHouse

@Heisenbug Особисто я просто використав би останнє значення і побачив, як добре це працює. Якщо я отримаю несподівані результати, я можу обчислити середнє значення значення осі, поки воно не обробляється FixedUpdate. Це одна з тих речей, для якої потрібне тестування ігор, щоб зрозуміти, що "відчуває" правильно.
MichaelHouse

1
В останніх тестах я виявив, що, всупереч тому, що мається на увазі в документах, свіжі вхідні прапори доступні вже у FixedUpdate (принаймні на ПК). Отже, встановивши прапор в «Оновлення», а потім діючи на нього в наступному FixedUpdate після цього (тобто наступному кадрі), як показано тут, фактично можна додати кадр затримки до гри, стосовно безпосередньо керування введенням у FixedUpdate безпосередньо. Це вимагає певної обережності, щоб уникнути подвійного керування введеннями для кадрів з декількома FixedUpdates або відсутніх входів для кадрів без FixedUpdate.
DMGregory

7

Вам потрібно зрозуміти, що кожен робить. Update()називається якомога частіше (не впевнений, можливо, це може бути обмежено), в будь-якому випадку - кожен кадр. FixedUpdate()називається кожен постійний проміжок часу (отже, "фіксований").

Введення входить в Update()таке просте (тому що, як ви зауважили, воно FixedUpdate()може не сприймати подію введення). Однак логіка гри може перейти в будь-яку. Фізика повинна бути детермінованою, і тому вона повинна бути в FixedUpdate(). Інші речі не повинні. Залежно від використання ви повинні вирішити, яка функція підходить.

Інше варто сказати, що в деяких додатках є оновлення всієї логіки гри в FixedUpdate()(навіть поза Unity) - це називається "фіксований крок циклу гри". Наявність всього коду оновлення у функції фіксованого кроку дає детермінізм і змушує ваш додаток вести себе однаково кожного разу (і на кожному пристрої). Також дозволяє отримати деякі фантазійні функції, наприклад, повтори.


Отже, якщо я вкладу все у FixedUpdate (), моя гра все одно зареєструє всі входи, правда?
Токамоча

1
Ні, ви можете розмістити там все оновлення логіки гри, але не перевіряючи вхід.
NPS

2
ця відповідь сповнена пропущеної інформації. Перш за все FixedUpdate отримує виклик 1 / fixDeltaTime раз у секунду , а не кожен n: th fixDeltaTime. По-друге, логіка гри завжди повинна працювати у FixedUpdate, оскільки це полегшує міркування. Оновлення призначене лише для відображення (я знаю, що майже ніхто з спільноти Unity не дотримується цього, але це дійсно, як це слід зробити). По-третє, FixedUpdate та його зв'язок із фізичним двигуном не має нічого спільного з детермінізмом.
Thr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.