Acumule o tempo decorrido e execute atualizações locais
Em cada retorno de chamada de animação, adicione o tempo decorrido a um acumulador. Embora o acumulador contenha pelo menos uma etapa, atualize a física em um intervalo constante, como 1/60 de segundo, e subtraia esse intervalo. Em seguida, renderize o estado mais recente. Defina um número máximo de etapas de atualização por quadro; caso contrário, uma pausa longa pode causar um grande atraso que consome mais tempo e aprofunda o atraso. Decida explicitamente se o tempo excedente será eliminado, limitado ou tratado por outra regra de recuperação.
Mantenha as unidades consistentes. Se a velocidade for medida em unidades do mundo do jogo por segundo, multiplique-a pelo passo fixo dentro de cada atualização da simulação. Não multiplique a mesma velocidade pelo tempo total decorrido do quadro e também execute várias atualizações fixas, ou o movimento será contado duas vezes.
Lide com entrada e renderização em seus próprios limites
Amostre a entrada mantida em cada etapa da simulação ou enfileira ações únicas até que uma etapa as consuma. Se ocorrer um pressionamento de tecla entre dois quadros, certifique-se de que não seja perdido antes da próxima atualização. A renderização pode interpolar entre estados físicos, enquanto a colisão e a pontuação usam o estado de simulação. O MDN descreve requestAnimationFrame como um retorno de chamada único agendado antes da repintura e aconselha o uso de seu carimbo de data/hora para calcular o progresso; um acumulador usa esse carimbo de data/hora para manter as atualizações fixas.
Teste os limites do loop
Compare o mesmo movimento curto e colisão em quadros comuns, um quadro lento simulado e uma pausa mais longa. Verifique se um jogador não atravessa uma parede fina, ganha velocidade extra após um travamento do quadro ou provoca uma colisão várias vezes durante a recuperação. Teste a pausa e o retorno da guia oculta de acordo com a regra pretendida. Se o loop de passo fixo tornar a simulação estável, mas uma colisão ainda falhar em alta velocidade, use um método de colisão adequado ao movimento em vez de aumentar a frequência de renderização.
Perguntas sobre física fixa do jogo timestep
Um intervalo de tempo fixo garante física determinística?
Não. Isso torna o intervalo de simulação consistente, mas o tempo de entrada, a matemática e a ordem de colisão ainda podem produzir variação. Controle-os separadamente para testes que exigem repetição.
Por que limitar as atualizações de atualização após uma paralisação de quadros?
Sem limites, a atualização pode monopolizar os frames posteriores e piorar o atraso. Escolha e teste uma política de recuperação adequada ao jogo, incluindo se o tempo simulado pode ser descartado.
Leitura complementar
Viu alguma informação desatualizada? Informar uma correção