Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Corrigindo trepidação (jitter), engasgos (stutter) e atraso de entrada (input lag)

O que são trepidação, engasgos e atraso de entrada?

Jitter (trepidação) e stutter (engasgos) são duas alterações diferentes no movimento visível de objetos na tela que podem afetar um jogo, mesmo quando executado em velocidade total. Esses efeitos são mais visíveis em jogos onde o mundo se move a uma velocidade constante em uma direção fixa, como jogos de corrida infinita ou de plataforma.

Input lag (atraso de entrada) não tem relação com jitter e stutter, mas às vezes é discutido em conjunto. O input lag refere-se ao atraso visível na tela ao realizar ações com o mouse, teclado, controle ou tela sensível ao toque. Pode estar relacionado ao código do jogo, ao código do motor ou a fatores externos (como o hardware). O input lag é mais perceptível em jogos que usam o mouse para mirar, como jogos em primeira pessoa. O input lag não pode ser totalmente eliminado, mas pode ser reduzido de várias maneiras.

Distinguindo entre trepidação (jitter) e engasgos (stutter)

Um jogo rodando em uma taxa de quadros normal sem apresentar nenhum efeito parecerá fluido:

../../_images/motion_normal.gif

Um jogo que apresenta jitter tremerá constantemente de uma maneira muito sutil:

../../_images/motion_jitter.gif

Por fim, um jogo que apresenta stutter parecerá fluido, mas parecerá parar ou voltar um quadro atrás a cada poucos segundos:

../../_images/motion_stutter.gif

Nervosidade (Jitter)

Pode haver muitas causas para o jitter. A mais típica acontece quando a frequência de física do jogo (geralmente 60 Hz) roda em uma taxa diferente da taxa de atualização do monitor. Verifique se a taxa de atualização do seu monitor é diferente de 60 Hz.

Às vezes, apenas alguns objetos parecem tremer (o personagem ou o cenário). Isso acontece quando eles são processados em fontes de tempo diferentes (um é processado no passo de física enquanto o outro é processado no passo ocioso/idle).

Essa causa de jitter pode ser mitigada ativando a interpolação de física nas Configurações do Projeto. A interpolação de física suavizará as atualizações de física interpolando as transformações dos objetos de física entre os quadros de física. Dessa forma, a representação visual dos objetos de física sempre parecerá suave, não importa a taxa de quadros e a taxa de atualização da física.

Ativar a interpolação de física traz algumas ressalvas das quais você deve estar ciente. Por exemplo, deve-se tomar cuidado ao teletransportar objetos para que eles não interpolem visivelmente entre a posição antiga e a nova posição quando isso não for intencional. Consulte a documentação de Interpolação de física para obter detalhes.

Nota

Ativar a interpolação de física aumentará o input lag para comportamentos que dependem da atualização de física, como o movimento do jogador. Na maioria dos jogos, isso geralmente é preferível ao jitter, mas considere isso com cuidado para jogos que operam em uma taxa de quadros fixa (como jogos de luta ou de ritmo). Esse aumento no input lag pode ser compensado aumentando a taxa de atualização da física, conforme descrito na seção Atraso de entrada (Input lag).

Engasgos (Stutter)

O stutter pode acontecer por vários motivos diferentes. Um deles é o jogo não conseguir manter o desempenho total da taxa de quadros devido a um gargalo de CPU ou GPU. Resolver isso é específico de cada jogo e exigirá otimização.

Outro motivo comum para travamentos é o travamento por compilação de shader. Isso ocorre quando um shader precisa ser compilado no momento em que um novo material ou efeito de partícula é gerado pela primeira vez em um jogo. Esse tipo de travamento geralmente só acontece na primeira vez em que se joga, ou após uma atualização do driver de vídeo, quando o cache de shaders é invalidado.

Desde o Godot 4.4, ao usar os renderizadores Forward+ ou Mobile, o motor tenta evitar o engasgo de compilação de shader usando uma abordagem de ubershader. Para que essa abordagem seja mais eficaz, deve-se tomar cuidado ao projetar cenas e recursos para que o Godot possa reunir o máximo de informações possível quando a cena/recurso é carregada, em oposição a quando ela é desenhada pela primeira vez. Veja Reduzindo travamentos decorrentes de compilações de shader (pipeline) para mais informações.

No entanto, ao usar o renderizador Compatibility, não é possível usar essa abordagem de ubershader devido a limitações técnicas no OpenGL. Portanto, para evitar o engasgo de compilação de shader no renderizador Compatibility, você precisa gerar cada malha e efeito visual na frente da câmera por um único quadro enquanto a fase está carregando. Isso garantirá que o shader seja compilado quando a fase for carregada, em vez de ocorrer durante o jogo. Isso pode ser feito atrás de uma UI 2D sólida (como um nó ColorRect em tela cheia) para que não fique visível para o jogador.

Nota

Em plataformas que suportam a desativação do V-Sync, os engasgos podem ser tornados menos perceptíveis desativando o V-Sync nas configurações do projeto. Isso, no entanto, fará com que ocorra screen tearing (rasgo na tela), especialmente em monitores com baixas taxas de atualização. Se o seu monitor suportar, considere ativar a taxa de atualização variável (G-Sync/FreeSync) enquanto deixa o V-Sync ativado. Isso permite mitigar algumas formas de engasgo sem introduzir rasgos na tela. No entanto, não ajudará com grandes engasgos, como os causados pela compilação de shaders.

Forçar sua placa de vídeo a usar o perfil de desempenho máximo também pode ajudar a reduzir os engasgos, ao custo de um maior consumo de energia da GPU.

Além disso, os engasgos podem ser induzidos pelo sistema operacional subjacente. Aqui estão algumas informações sobre engasgos em diferentes SOs:

Windows

O Windows é conhecido por causar engasgos em jogos em modo janela. Isso depende principalmente do hardware instalado, da versão dos drivers e dos processos executados em paralelo (por exemplo, ter muitas abas do navegador abertas pode causar engasgos em um jogo em execução). Para evitar isso, o Godot aumenta a prioridade do jogo para "Above Normal" (Acima do Normal). Isso ajuda consideravelmente, mas pode não eliminar completamente os engasgos.

Eliminar isso completamente exige dar ao seu jogo privilégios totais para se tornar "Time Critical" (Crítico de Tempo), o que não é recomendado. Alguns jogos podem fazer isso, mas o conselho é aprender a viver com esse problema, já que é comum em jogos para Windows e a maioria dos usuários não jogará em modo janela (jogos jogados em janela, por exemplo, jogos de quebra-cabeça, geralmente não apresentarão esse problema de qualquer maneira).

Para tela cheia, o Windows dá prioridade especial ao jogo, de modo que o engasgo não é mais visível e se torna muito raro. É assim que a maioria dos jogos é jogada.

Ao usar um mouse com uma taxa de varredura (polling rate) de 1.000 Hz ou mais, considere usar uma instalação totalmente atualizada do Windows 11, que vem com correções relacionadas à alta utilização de CPU com mouses de alta taxa de varredura. Essas correções não estão disponíveis no Windows 10 e em versões anteriores.

Dica

Os jogos devem usar o modo de janela Exclusive Fullscreen, em oposição ao Fullscreen, que foi projetado para evitar que o Windows trate automaticamente a janela como se fosse tela cheia exclusiva.

O Fullscreen deve ser usado por aplicativos GUI que desejam usar transparência por pixel sem o risco de tê-la desativada pelo sistema operacional. Ele consegue isso deixando uma linha de 1 pixel na parte inferior da tela. Em contraste, o Exclusive Fullscreen usa o tamanho real da tela e permite que o Windows reduza o jitter e o atraso de entrada (input lag) para jogos em tela cheia.

Linux

Os engasgos podem ser visíveis no Linux desktop, mas isso geralmente está associado a diferentes drivers de vídeo e compositores de janela. Alguns compositores podem ativar esse problema (por exemplo, o KWin), por isso é aconselhável tentar usar um diferente para descartá-lo como a causa. Alguns gerenciadores de janelas, como o KWin e o Xfwm, permitem desativar manualmente a composição, o que pode melhorar o desempenho (ao custo de rasgos na tela).

Não há solução alternativa para engasgos de driver ou de compositor, a não ser relatar isso como um problema aos desenvolvedores do driver ou do compositor. Os engasgos podem estar mais presentes ao jogar em modo janela do que em tela cheia, mesmo com a composição desativada.

O Feral GameMode pode ser usado para aplicar otimizações automaticamente (como forçar o perfil de desempenho da GPU) ao executar processos específicos.

macOS

Geralmente, o macOS é livre de engasgos, embora recentemente alguns bugs tenham sido relatados ao rodar em tela cheia (isso é um bug do macOS). Se você tiver uma máquina que apresente esse comportamento, por favor nos avise.

Android

Geralmente, o Android é livre de engasgos e trepidações porque a atividade em execução recebe toda a prioridade. Dito isso, pode haver dispositivos problemáticos (o Kindle Fire mais antigo é conhecido por ser um deles). Se você notar esse problema no Android, por favor nos avise.

iOS

Os dispositivos iOS geralmente são livres de engasgos, mas dispositivos mais antigos que rodam versões mais recentes do sistema operacional podem apresentar problemas. Isso geralmente é inevitável.

Atraso de entrada (Input lag)

Configuração do projeto

Em plataformas que suportam a desativação do V-Sync, o input lag pode ser tornado menos perceptível desativando o V-Sync nas configurações do projeto. Isso, no entanto, fará com que ocorra screen tearing (rasgo na tela), especialmente em monitores com baixas taxas de atualização. Sugere-se disponibilizar o V-Sync como uma opção para os jogadores alternarem.

Ao usar os métodos de renderização Forward+ ou Mobile, outra forma de reduzir a latência visual quando o V-Sync está ativado é usar V-Sync com buffer duplo em vez do V-Sync com buffer triplo padrão. Desde o Godot 4.3, isso pode ser feito reduzindo a configuração de projeto Display > Window > V-Sync > Swapchain Image Count (Mostrar > Janela > V-Sync > Número de Imagens Swapchain) para 2. A desvantagem de usar buffer duplo é que a taxa de quadros será menos estável se a taxa de atualização da tela não puder ser atingida devido a um gargalo de CPU ou GPU. Por exemplo, em uma tela de 60 Hz, se a taxa de quadros normalmente cair para 55 FPS durante o jogo com buffer triplo, ela terá que cair momentaneamente para 30 FPS com buffer duplo (e depois voltar para 60 FPS quando possível). Como resultado, o V-Sync com buffer duplo só é recomendado se você puder atingir consistentemente a taxa de atualização da tela no hardware alvo.

Aumentar o número de iterações de física por segundo também pode reduzir a latência de entrada causada pela física. Isso é especialmente perceptível ao usar interpolação de física (que melhora a suavidade, mas aumenta a latência). Para fazer isso, defina Physics > Common > Physics Ticks Per Second para um valor maior que o padrão 60, ou defina Engine.physics_ticks_per_second em tempo de execução em um script. Valores que sejam múltiplos da taxa de atualização do monitor (normalmente 60) funcionam melhor quando a interpolação de física está desativada, pois evitam instabilidade (jitter).Isso significa que valores como 120, 180 e 240 são bons pontos de partida. Como bônus, taxas de FPS de física mais altas tornam problemas de tunneling e instabilidade da física menos propensos a ocorrer.

A desvantagem de aumentar o FPS de física é que o uso da CPU aumentará, o que pode levar a gargalos de desempenho em jogos que possuem códigos pesados de simulação física. Isso pode ser mitigado aumentando o FPS de física apenas em situações onde a baixa latência é crítica, ou permitindo que os jogadores ajustem o FPS de física para corresponder ao seu hardware. No entanto, diferentes valores de FPS de física levarão a resultados diferentes na simulação física, mesmo quando o delta é usado de forma consistente na lógica do seu jogo. Isso pode dar a certos jogadores uma vantagem sobre outros. Portanto, permitir que o próprio jogador altere o FPS de física deve ser evitado em jogos multijogador competitivos.

Por fim, você pode desativar o buffer de entrada por quadro renderizado chamando Input.set_use_accumulated_input(false) em um script. Isso fará com que as funções _input() e _unhandled_input() em seus scripts sejam chamadas a cada entrada, em vez de acumular entradas e esperar que um quadro seja renderizado. Desativar o acúmulo de entrada aumentará o uso do processador, por isso deve ser feito com cautela.

Dica

Em qualquer projeto Godot, você pode usar o argumento de linha de comando --disable-vsync para desabilitar o V-Sync à força. Desde o Godot 4.2, --max-fps <fps> também pode ser usado para definir um limite de FPS (0 é ilimitado). Esses argumentos podem ser usados ao mesmo tempo.

Específico de Hardware/SO

If your monitor supports it, consider enabling variable refresh rate (G-Sync/FreeSync) while leaving V-Sync enabled, then cap the framerate in the project settings to a slightly lower value than your monitor's maximum refresh rate as per this page.

This may be counterintuitive at first, but capping the FPS below the maximum refresh rate range ensures that the OS never has to wait for vertical blanking to finish. This leads to similar input lag as V-Sync disabled with the same framerate cap (usually less than 1 ms greater), but without any tearing.

The formula used to determine the framerate cap is refresh - (refresh * refresh / 3600.0) where refresh is the monitor's refresh rate in Hz. This table shows the framerate cap to use for common refresh rates (the cap is rounded down to the nearest integer):

Refresh rate

Framerate cap

60 Hz

58 FPS

75 Hz

73 FPS

120 Hz

115 FPS

144 Hz

138 FPS

165 Hz

157 FPS

240 Hz

224 FPS

360 Hz

324 FPS

480 Hz

416 FPS

This framerate cap can be set by changing the Application > Run > Max FPS project setting or assigning Engine.max_fps at runtime in a script. At higher refresh rates, a lower cap is needed to ensure timing inaccuracies don't cause the display to engage V-Sync (which would increase input lag).

Em algumas plataformas, você também pode optar por um modo de baixa latência nas opções do driver de vídeo (como o Painel de Controle da NVIDIA no Windows). A configuração Ultra fornecerá a menor latência possível, ao custo de taxas de quadros médias ligeiramente mais baixas. Forçar a GPU a usar o perfil de desempenho máximo também pode reduzir ainda mais o input lag, ao custo de um maior consumo de energia (e consequentemente mais calor/barulho de cooler).

Por fim, certifique-se de que seu monitor esteja funcionando na taxa de atualização mais alta possível nas configurações de exibição do sistema operacional.

Além disso, certifique-se de que seu mouse esteja configurado para usar sua taxa de varredura (polling rate) mais alta (normalmente 1.000 Hz para mouses gamers, às vezes mais). Altas taxas de varredura USB podem, no entanto, resultar em alto uso de CPU, por isso 500 Hz pode ser uma escolha mais segura em CPUs mais fracas. Se o seu mouse oferecer várias configurações de DPI, considere também usar a configuração mais alta possível e reduzir a sensibilidade do jogo para reduzir a latência do mouse.

No Linux ao usar o X11, desativar a composição em gerenciadores de janelas que o permitem (como o KWin ou Xfwm) pode reduzir significativamente o input lag.

Relatando problemas de trepidação (jitter), engasgos (stutter) ou atraso de entrada (input lag)

Se você estiver relatando um problema de engasgo ou trepidação (abrindo uma issue) que não seja causado por nenhum dos motivos acima, especifique com muita clareza todas as informações possíveis sobre o dispositivo, sistema operacional, versões de drivers, etc. Isso pode ajudar a diagnosticá-lo melhor.

Se você estiver relatando problemas de input lag, inclua uma gravação feita com uma câmera de alta velocidade (como o modo de vídeo em câmera lenta do seu celular). A gravação deve ter tanto a tela quanto o dispositivo de entrada visíveis para que o número de quadros entre uma entrada e o resultado na tela possa ser contado. Além disso, certifique-se de mencionar a taxa de atualização do seu monitor e a taxa de varredura do seu dispositivo de entrada (especialmente para mouses).

Também certifique-se de usar o termo correto (jitter, stutter, input lag) com base no comportamento apresentado. Isso ajudará a entender seu problema muito mais rápido. Forneça um projeto que possa ser usado para reproduzir o problema e, se possível, inclua uma gravação de tela demonstrando o bug.