Qual é a diferença entre Update e FixedUpdate no Unity e devo me preocupar?

10

Disseram-me para usar Update()nos gráficos e FixedUpdate()na física, mas às vezes minhas entradas não são registradas quando uso FixedUpdate(). Funciona bem se eu usar Update()para tudo embora.

Devo me preocupar FixedUpdate()ou estou fazendo algo errado?

Tokamocha
fonte

Respostas:

10

FixedUpdatepode correr mais rápido ou mais devagar do que Updatedependendo das suas configurações. Isso dependerá da carga (a velocidade da Updateexecução) e da velocidade que você definiu FixedUpdate(encontrado em Editar-> Configurações do projeto-> Tempo). Idealmente, como Updateé executado uma vez por quadro, é aqui que você deseja capturar a entrada. Se você precisar agir de acordo com a entrada do FixedUpdatemétodo (como controlar corpos físicos), defina sinalizadores Updatee lide com eles FixedUpdate:

bool leftMouseDown = false;

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

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

Ainda é uma boa idéia controlar a física a partir do FixedUpdatemétodo, pois é improvável que a física precise ser atualizada com tanta frequência, e a física em uma atualização fixa é muito mais fácil de prever ( determinismo ) do que a física em uma atualização variável.

MichaelHouse
fonte
e se, em vez de uma condição bool (es.GetMouseButtonDown), precisarmos ler o valor de um eixo (Input.GetAxis ("Horizontal"))? Se a atualização for executada mais vezes que o FixedUpdate, qual é o seu conselho nesse caso? Devemos considerar o cálculo do valor médio do eixo ocorrido durante as várias atualizações antes de consumi-las na atualização? (+1 btw)
Heisenbug 20/04
Como descubro a rapidez com que o FixedUpdate é?
precisa saber é o seguinte
1
@Tokamocha A taxa de atualização fixa é definida em Editar-> Configurações do projeto-> Tempo.
MichaelHouse
@Heisenbug Pessoalmente, eu usaria o último valor e veria como isso funciona. Se obtiver resultados inesperados, poderei calcular uma média de execução do valor do eixo até que seja processado por FixedUpdate. Essa é uma daquelas coisas que precisam de testes para descobrir o que "parece" certo.
MichaelHouse
1
Descobri em testes recentes que, ao contrário do que está implícito nos documentos, novos sinalizadores de entrada já estão disponíveis no FixedUpdate (pelo menos no PC). Portanto, definir um sinalizador no Update e, em seguida, agir no próximo FixedUpdate depois disso (ou seja, o próximo quadro), como mostrado aqui, pode realmente adicionar um quadro de latência ao jogo, em relação à manipulação direta da entrada no FixedUpdate. Isso requer alguns cuidados, no entanto, para evitar a manipulação de entrada dupla em quadros com várias FixedUpdates ou entradas ausentes nos quadros sem FixedUpdate.
DMGregory
7

Você precisa entender o que cada um faz. Update()é chamado o mais rápido possível (não tenho certeza, talvez possa ser limitado), de qualquer maneira - cada quadro. FixedUpdate()é chamado a cada quantidade constante de tempo (daí "fixo").

A entrada entra Update(), simples assim (porque, como você notou, FixedUpdate()pode não capturar o evento de entrada). A lógica do jogo, no entanto, pode ser uma das duas. Física precisa ser determinista e é por isso que ele deve estar em FixedUpdate(). Outras coisas não precisam. Dependendo do uso, você deve decidir qual função é apropriada.

No entanto, vale a pena dizer que alguns aplicativos têm toda a atualização da lógica do jogo FixedUpdate()(mesmo fora de Unity) - é chamada de "loop de jogo com etapa fixa". Ter todo o código de atualização em uma função de etapa fixa fornece determinismo e aumenta a probabilidade de seu aplicativo se comportar da mesma maneira todas as vezes (e em cada dispositivo). Também permite alguns recursos sofisticados, como replays.

NPS
fonte
Então, se eu colocar tudo em FixedUpdate (), meu jogo ainda registrará todas as entradas, certo?
precisa saber é o seguinte
1
Não, você pode colocar lá todas as atualizações da lógica do jogo, mas não a verificação de entrada.
NPS
2
esta resposta está cheia de informações incorretas. Antes de mais nada, o FixedUpdate é chamado de 1 / FixedDeltaTime vezes por segundo , nem a cada n / ésimo FixedDeltaTime. Segundo, a lógica do jogo sempre deve ser corrigida no FixedUpdate, pois facilita a razão. A atualização é apenas para fins de renderização (eu sei que quase ninguém na comunidade do Unity segue isso, mas é assim que deve ser feito). Terceiro, o FixedUpdate e sua relação com o mecanismo de física não têm nada a ver com determinismo.
thr