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:
- Entrada (input): o jogo verifica teclado, mouse, controle ou toque na tela para saber o que o jogador quer fazer.
- Atualização (update): a lógica avança: personagens se movem, colisões são verificadas, pontuação muda, inimigos tomam decisões.
- 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”.
| FPS | Tempo aproximado por quadro | Sensação geral |
|---|---|---|
| 30 | cerca de 33 ms | Aceitável em muitos jogos, mas menos fluido |
| 60 | cerca de 16,7 ms | Padrão comum de fluidez |
| 120 | cerca de 8,3 ms | Muito 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.



















