Tutorial aponta o erro de Blueprint que derruba FPS na UE5: usar Event Tick para tudo

Um tutorial recém-publicado do canal Gorka Games cravou o que chama de “o erro de 90% dos iniciantes em UE5”: concentrar lógica no Event Tick — o evento que roda a cada frame — e, com isso, multiplicar cálculos desnecessários por 60 execuções por segundo (ou mais), até o projeto ficar lento, instável ou até travar.

Unreal Engine 5: explicacao do Event Tick como causa comum de queda de performance em Blueprints

O video aponta o Event Tick como um dos maiores viloes de performance em projetos UE5.

O que o Event Tick faz (e por que ele vira um “vazamento” de desempenho)

No Blueprint, o Event Tick executa “por frame”. Em um jogo a 60 FPS, isso significa que qualquer cadeia de nós conectada nele roda 60 vezes por segundo. A tese do vídeo é direta: em sistemas comuns (pickup, regeneração de vida, HUD), isso costuma ser desperdício de CPU, porque a lógica não precisa ser avaliada o tempo todo.

O autor reforça que, isoladamente, um Tick simples pode parecer inofensivo. O problema aparece quando vários atores e widgets repetem o mesmo padrão: pequenas rotinas por frame se somam, “engolindo” performance ao longo do tempo.

Exemplo 1: pickup não deve medir distância a cada frame

No primeiro caso, um item “flutuante” foi construído com Tick para checar, por frame, a distância entre o player e o objeto. Se estivesse abaixo de 100 unidades, o item seria coletado e removido do mundo.

O vídeo aponta o que está errado: medir distância continuamente “não faz sentido” quando a coleta depende de proximidade. Em vez disso, a checagem deve acontecer só quando existe um evento real de interação.

Blueprint de item com sphere collision trigger para substituir checagem de distancia no Event Tick

Troca da checagem por frame por um trigger de colisao com Sphere Collision no Blueprint.

A alternativa mostrada é criar uma Sphere Collision (um volume invisível que detecta sobreposição) chamada “trigger” e usar OnComponentBeginOverlap. Na prática: o Blueprint roda uma vez quando o player entra no volume, em vez de rodar todo frame.

Para filtrar quem pode coletar o item, o tutorial usa uma checagem de tag (ex.: “Player”). Se um inimigo encostar no trigger, não coleta; se o ator com a tag correta entrar, coleta.

Exemplo 2: regeneração de vida via Timer, não via Tick

O segundo exemplo mira um padrão clássico: health regen. O sistema original verificava no Tick se a vida era menor que 100 e, se fosse, adicionava 1 ponto, com um Clamp para manter o valor entre 0 e 100.

O tutorial substitui a lógica por Set Timer by Event. Em linguagem simples: em vez de rodar a cada frame, você agenda um evento para rodar em intervalos (por exemplo, 1 segundo) e com looping. Isso reduz radicalmente a frequência de execução e dá controle fino do ritmo da regeneração.

Blueprint com Begin Play e Set Timer by Event para regeneracao de vida sem usar Event Tick

Regeneracao de vida sai do Tick e vira um Set Timer by Event com looping a cada 1 segundo.

O fluxo apresentado é: Begin Play (evento que dispara quando o jogo começa) inicia o timer; o timer chama um Custom Event (“Regenerate Health”) periodicamente; e o Blueprint ainda pode incluir um Branch para só executar se a vida estiver abaixo do máximo, evitando trabalho sem necessidade.

Exemplo 3: bindings em widgets também rodam por frame

O alerta mais importante para UI: bindings de widgets (como “bind” do Percent de uma Progress Bar) podem atualizar a cada frame. No exemplo do vídeo, o binding acessa o player, faz cast para o personagem e divide a vida por 100 para alimentar o Percent (0 a 1) da barra.

O problema: esse binding vira um “Tick disfarçado” dentro da interface, repetindo cast e leituras todo frame. Em projetos com HUD complexa, isso pode virar um gargalo silencioso.

Widget de barra de vida com binding atualizando percent a cada frame e alternativa com Set Percent

Bindings em widgets tambem rodam todo frame; o video recomenda atualizar a barra so quando a vida mudar.

A alternativa apresentada é atualizar o widget só quando a vida mudar: obter a referência do widget, garantir que o elemento de UI esteja marcado como “Is Variable” no Designer, e chamar Set Percent diretamente no momento em que a variável de vida é alterada (por dano ou regen). Resultado: a UI para de recalcular quando nada mudou.

Quando o Tick ainda faz sentido

O vídeo não demoniza o Tick por completo. Ele continua sendo útil quando a lógica realmente precisa de precisão por frame — como animações suaves, interpolação e movimentos que exigem atualização contínua. A regra prática defendida é simples: se o evento pode ser acionado por colisão, timer ou mudança de estado, não há motivo para usar Tick.

Para ver os Blueprints, nós e substituições em ação (incluindo o passo a passo completo de cada troca), o convite é direto: assista ao vídeo oficial.

Fonte: Gorka Games