Game Loop: O Coração de Qualquer Jogo e Como Ele Controla o FPS

Entenda o que é o game loop, como ele atualiza e desenha o jogo a cada quadro e por que o delta time evita que o jogo rode mais rápido ou lento.

Compartilhar no Linkedin Compartilhar no WhatsApp

Tempo estimado de leitura: 8 minutos

Imagem do artigo Game Loop: O Coração de Qualquer Jogo e Como Ele Controla o FPS

Se você já jogou algum jogo digital, ele provavelmente estava fazendo a mesma coisa dezenas de vezes por segundo: ler o que você apertou, atualizar o mundo do jogo e desenhar tudo na tela. Essa repetição constante tem nome: game loop, ou laço principal do jogo. Entender essa ideia é o primeiro passo para quem quer programar jogos, em qualquer linguagem ou motor.

O que é o game loop?

Programas comuns, como um editor de texto, ficam parados esperando o usuário agir. Já um jogo precisa continuar funcionando mesmo quando o jogador não faz nada: inimigos se movem, a música toca, animações continuam. Para isso, o jogo roda um laço que se repete até o jogador sair.

Em termos simples, cada volta desse laço é um quadro (frame) do jogo. Quanto mais voltas por segundo, mais fluida a experiência parece.

As três etapas de cada quadro

Embora cada jogo tenha particularidades, a estrutura básica do game loop costuma ter três etapas:

  1. Entrada (input): o jogo verifica teclado, mouse, controle ou toque na tela para saber o que o jogador quer fazer.
  2. Atualização (update): a lógica avança: personagens se movem, colisões são verificadas, pontuação muda, inimigos tomam decisões.
  3. Renderização (render): o estado atual do mundo é desenhado na tela.

Em forma de pseudocódigo, a ideia é esta:

enquanto o jogo estiver rodando:
    processar_entrada()
    atualizar(tempo_decorrido)
    desenhar()

Separar atualização e desenho é uma boa prática: a primeira cuida das regras do jogo, e a segunda apenas mostra o resultado. Isso facilita organizar o código e, mais tarde, resolver problemas de desempenho.

O que é FPS?

FPS significa frames per second, ou quadros por segundo. Indica quantas vezes o game loop completa uma volta (e desenha a tela) em um segundo. Valores como 30 e 60 FPS são muito comuns, e telas com taxas de atualização maiores permitem valores superiores. Quanto mais estável for esse número, mais suave o jogo parece. Oscilações bruscas causam a sensação de “travadas”.

FPSTempo aproximado por quadroSensação geral
30cerca de 33 msAceitável em muitos jogos, mas menos fluido
60cerca de 16,7 msPadrão comum de fluidez
120cerca de 8,3 msMuito fluido, exige mais do hardware

O problema: jogo rápido demais em computadores rápidos

Imagine que você programou o personagem para andar 5 pixels a cada quadro. Em um computador que roda a 60 FPS, ele andará 300 pixels por segundo. Em outro que roda a 120 FPS, andará 600 pixels por segundo, o dobro da velocidade. Ou seja, a velocidade do jogo passou a depender da potência da máquina, o que é um grande problema.

Jogos antigos sofriam bastante com isso, e é por isso que alguns títulos clássicos ficam rápidos demais em equipamentos modernos se não forem adaptados.

A solução: delta time

A saída mais comum é usar o delta time: o tempo que passou entre o quadro anterior e o atual. Em vez de mover o personagem por “pixels por quadro”, você o move por “pixels por segundo” multiplicado pelo delta time:

posicao = posicao + velocidade * delta_time

Assim, se o computador é lento e o delta time é maior, o personagem dá um passo maior por quadro. Se o computador é rápido e o delta time é menor, o passo é menor. No fim de um segundo, o deslocamento é o mesmo nos dois casos. A maioria dos motores de jogo, como Unity, Godot e Unreal, oferece o delta time pronto para uso.

Passo fixo e passo variável

Existem duas abordagens principais para controlar a atualização da lógica:

  • Passo variável: a lógica é atualizada uma vez por quadro, usando o delta time real. É simples, mas pode gerar resultados ligeiramente diferentes em máquinas distintas, principalmente em cálculos de física.
  • Passo fixo: a lógica é atualizada em intervalos constantes (por exemplo, 50 vezes por segundo), independentemente do FPS de desenho. É comum para física e dá mais previsibilidade.

Muitos motores usam uma combinação: a física roda em passo fixo, enquanto a renderização acompanha a velocidade da máquina.

Como o game loop aparece nos motores de jogo

Quando você usa um motor, o game loop já existe, escondido por trás de funções que você preenche. Em geral, há uma função chamada a cada quadro para a lógica (muitas vezes chamada de Update ou process) e outra para a física em intervalos fixos. Mesmo sem escrever o laço, é importante entender o que acontece, pois isso ajuda a evitar erros como colocar cálculos pesados na função de atualização e causar quedas de FPS.

Um exemplo mental: o jogo da bola quicando

Para visualizar tudo isso, imagine um jogo bem simples em que uma bola quica na tela. Na etapa de entrada, o jogo verifica se o jogador pressionou alguma tecla, por exemplo para reiniciar. Na atualização, a posição da bola muda de acordo com a velocidade e o delta time, e o jogo verifica se ela bateu no chão ou nas paredes para inverter a direção. Na renderização, a tela é limpa e a bola é desenhada na nova posição. Quando esse ciclo se repete dezenas de vezes por segundo, nossos olhos enxergam um movimento contínuo, como em um desenho animado feito de muitas imagens rápidas.

Esse exemplo mostra por que o laço é tão importante: sem ele, a bola apareceria parada. E mostra também por que cuidar do tempo importa. Se a bola andasse uma quantidade fixa por quadro, ela cruzaria a tela mais rápido em um computador veloz do que em um celular simples. Com o delta time, o comportamento se mantém igual para todos os jogadores.

Dicas para quem está começando

  • Sempre use o delta time ao mover objetos ou contar tempo.
  • Mantenha a lógica separada do desenho no seu código.
  • Evite operações demoradas dentro do laço, como carregar arquivos a cada quadro.
  • Teste seu jogo em máquinas diferentes, ou limite o FPS para simular situações variadas.
  • Comece com um projeto pequeno, como um jogo de uma tela, para praticar o ciclo entrada, atualização e desenho.

Conclusão

O game loop é o motor invisível de todo jogo: lê a entrada, atualiza o mundo e desenha o resultado, quadro após quadro. Com o delta time, você garante que o jogo se comporte de maneira consistente em diferentes máquinas. Se o seu objetivo é criar seus próprios jogos, os cursos de programação de jogos disponíveis na Cursa podem ajudar a transformar esse conceito em prática, com projetos guiados e exemplos para diferentes níveis.

Cookies, Cache e Histórico: O Que o Navegador Guarda Sobre Você

Entenda o que são cookies, cache e histórico do navegador, para que servem, quando limpar cada um e como isso afeta sua privacidade.

Sensores e Atuadores: Como o Arduino Percebe o Mundo e Age Sobre Ele

Entenda a diferença entre sensores e atuadores, como o Arduino lê sinais e aciona dispositivos, e como montar seus primeiros projetos.

Endereço IP, Máscara de Sub-rede e Gateway: O Trio Que Faz Sua Rede Funcionar

Entenda de forma prática o que são endereço IP, máscara de sub-rede e gateway padrão, e como esses três parâmetros conversam entre si.

Compressão de Arquivos: Como o ZIP Consegue Reduzir o Tamanho dos Seus Dados

Entenda como funciona a compressão de arquivos, a diferença entre métodos com e sem perda e quando cada formato faz sentido.

Expressões Regulares (Regex): O Que São e Como Usar na Prática

Aprenda o que são expressões regulares, os principais símbolos, quantificadores e como aplicar regex para buscar e validar textos.

Como Funciona o DNS: o Sistema que Traduz Nomes em Endereços na Internet

Entenda de forma simples o que é DNS, como acontece a resolução de nomes, os principais tipos de registro e por que ele é essencial para a internet.

INNER JOIN, LEFT JOIN e RIGHT JOIN: como relacionar tabelas no SQL

Entenda de forma simples como funcionam INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN para combinar dados de várias tabelas no SQL.

TypeScript para iniciantes: o que é e por que ele melhora o JavaScript

Entenda o que é TypeScript, como a tipagem estática ajuda a evitar erros e por que ele se tornou essencial no desenvolvimento web moderno.