Ir para o conteúdo
R42 / Games / 00119

Compilação de shaders: por que jogos de PC engasgam na primeira vez

O FPS médio pode continuar alto enquanto a criação de um novo pipeline atrasa um quadro. Cache, pré-compilação e distribuição antecipada reduzem o problema.

13.09.26 Misael 5 MIN
WhatsApp X Facebook LinkedIn Telegram E-mail

R42 / RESUMO

Jogos de PC podem engasgar quando precisam compilar um shader ou criar um pipeline gráfico no momento em que um efeito aparece pela primeira vez. A tarefa aumenta o tempo de um quadro isolado, por isso o FPS médio pode parecer alto apesar da interrupção visível. Pré-compilar, trabalhar em segundo plano e reutilizar caches reduz o problema, mas atualizações e combinações inéditas podem exigir novo processamento.

PONTOS-CHAVE

  1. 01Shaders são programas executados pela GPU e precisam ser preparados para a combinação de jogo, placa e driver.
  2. 02Um Pipeline State Object reúne shaders e estados de renderização; criá-lo durante o desenho pode atrasar um quadro.
  3. 03Stutter aparece melhor em picos de frame time do que na média de FPS.
  4. 04Caches tornam execuções posteriores mais suaves, mas podem ser invalidados por mudanças no jogo ou no driver.
  5. 05Pré-compilação no carregamento ou distribuição de shaders prontos troca pausas durante a partida por espera antecipada e maior coordenação técnica.

Um jogo pode exibir 90 ou 120 quadros por segundo na maior parte do tempo e ainda parecer instável ao abrir uma porta, lançar um golpe ou mostrar um efeito novo. A contradição é apenas aparente: a média de FPS resume muitos quadros, enquanto um engasgo nasce do atraso de um quadro específico. Quando o motor precisa compilar um shader ou criar um pipeline gráfico naquele instante, o tempo de entrega pode subir o suficiente para produzir uma pausa visível.

Esse comportamento é chamado de shader compilation stutter. Ele aparece com frequência na primeira execução ou no primeiro encontro com determinada combinação de material, luz e efeito. Depois, a mesma cena pode ficar mais suave porque o resultado da compilação já está em memória ou foi salvo em cache.

Shaders são programas, não texturas

Um shader é um programa pequeno executado pela GPU em uma etapa do processo de renderização. Há shaders que transformam vértices, calculam cores de pixels, tratam iluminação, sombras e outros efeitos. O jogo costuma fornecer esse código em uma forma intermediária, mas o driver ainda precisa prepará-lo para a arquitetura da placa gráfica instalada.

No PC, a mesma versão de um jogo precisa funcionar com diferentes famílias de GPU, versões de driver e configurações. Isso torna mais difícil entregar um único binário gráfico pronto para todos. A compilação pode acontecer antes da partida, em segundo plano ou somente quando o efeito é solicitado.

O pipeline amplia o número de combinações

APIs modernas não trabalham apenas com um shader isolado. Direct3D 12 e Vulkan agrupam shaders e vários estados de renderização em objetos de pipeline. Um Pipeline State Object, ou PSO, pode incluir programas de vértice e pixel, formato dos dados, rasterização, mistura de cores, profundidade e formatos dos alvos de renderização.

Essa organização permite que o driver prepare dependências com antecedência e troque estados rapidamente durante o desenho. O custo aparece quando o jogo pede um pipeline que ainda não existe. A documentação do Vulkan alerta que criar pipelines durante a renderização, sem cache, pode aumentar significativamente o tempo do quadro. A Epic descreve a mesma escolha no Unreal Engine: se um PSO necessário ainda estiver compilando, o motor pode adiar o desenho, usar um material provisório ou continuar e aceitar um possível engasgo.

FPS médio não revela o pico de frame time

Em 60 FPS, cada quadro tem cerca de 16,7 milissegundos para ficar pronto. Se centenas de quadros cumprem esse prazo, mas um deles leva 40 ou 80 milissegundos, a média pode continuar respeitável. O jogador, porém, percebe a interrupção. Por isso, gráficos de frame time são mais úteis do que a média de FPS para identificar stutter: eles mostram quanto cada quadro demorou.

A compilação também disputa recursos da CPU. Mesmo quando ocorre em tarefas assíncronas, ela pode concorrer com simulação, preparação de comandos e carregamento. A pré-compilação precisa equilibrar rapidez, uso de memória, quantidade de threads e duração da tela de carregamento.

Por que a segunda visita costuma ser melhor

O cache guarda representações já preparadas para reutilização. O Vulkan permite salvar dados de pipeline em disco e carregá-los em execuções seguintes. Drivers também mantêm seus próprios caches. Quando o motor solicita novamente a mesma combinação, parte do trabalho caro pode ser evitada.

Isso explica por que atravessar um trecho pela segunda vez frequentemente parece mais suave e por que testes feitos depois de uma primeira execução podem esconder o problema. A Epic recomenda limpar deliberadamente o cache ao testar a experiência inicial, justamente para não confundir uma sessão aquecida com o primeiro contato do jogador.

O cache não é eterno. Mudanças no jogo podem criar novas variantes, e dados compilados são específicos da GPU e do driver. A Microsoft informa que uma atualização do driver pode invalidar caches e exigir nova preparação. Alterar configurações gráficas também pode revelar combinações que ainda não foram usadas, embora isso varie conforme o motor.

Carregar antes é melhor do que parar durante a ação

Uma solução comum é compilar shaders na inicialização ou durante uma tela de carregamento. A espera fica explícita, mas reduz a chance de o trabalho bloquear um quadro no meio da partida. Outra estratégia é registrar os pipelines usados em testes e aquecer o cache antes de eles aparecerem. O Unreal Engine também oferece coleta automática e compilação assíncrona de PSOs.

A Microsoft está levando parte desse processo para a distribuição. O Advanced Shader Delivery combina dados fornecidos pelo jogo com compiladores de fabricantes para entregar um cache compatível com uma combinação de hardware e driver. A empresa afirma que o sistema reduz tempos de carregamento e stutter em títulos e dispositivos compatíveis. Esses resultados são declarações da Microsoft e dependem de suporte da loja, do jogo e do hardware; não representam uma solução universal para todo jogo de PC.

Nem todo engasgo é compilação

Carregamento de texturas e modelos, travessia de mundos abertos, descompressão de arquivos, falta de memória, tarefas da CPU, coleta de lixo e comunicação de rede também podem alongar um quadro. O padrão “engasga ao ver o efeito pela primeira vez e melhora ao repetir” é compatível com compilação, mas não confirma sozinho a causa.

Para o jogador, esperar uma etapa de compilação terminar e evitar apagar caches pode ajudar quando o título foi projetado para esse fluxo. A correção definitiva, porém, depende principalmente do desenvolvimento: enumerar variantes, preparar pipelines no momento adequado, testar com cache vazio e impedir que uma combinação inédita bloqueie a renderização. Hardware rápido reduz o custo, mas não substitui uma política correta de compilação.

Texto de

Misael

Responsável pela apuração e redação desta matéria na Rota42.

R42 / FAQ

O que é um shader em um jogo?

É um pequeno programa executado pela GPU para etapas de renderização, como transformar geometria, calcular iluminação, aplicar materiais e produzir pixels. Antes de ser usado, ele precisa chegar a uma forma compatível com a GPU e o driver.

Por que a compilação de shaders causa engasgos?

Se o jogo encontra uma combinação gráfica ainda não preparada, pode precisar compilar o código e criar o pipeline antes de desenhar o quadro. Quando essa tarefa bloqueia a renderização, o tempo daquele quadro sobe e o jogador percebe uma pausa.

Por que o mesmo trecho costuma ficar mais suave na segunda vez?

Depois da primeira criação, o pipeline pode permanecer em memória ou ser salvo em cache. Ao reencontrar o efeito, o jogo ou o driver reutiliza o trabalho pronto em vez de repetir toda a compilação.

Atualizar o driver pode fazer os shaders compilarem novamente?

Pode. Os dados compilados dependem do driver e da GPU, e uma atualização pode invalidar caches existentes. O jogo também pode precisar reconstruí-los após mudanças em shaders, efeitos ou configurações.

Todo stutter em jogo de PC vem de shaders?

Não. Carregamento de arquivos, travessia do cenário, pressão de memória, tarefas da CPU, coleta de lixo e rede também podem produzir pausas. Um engasgo na primeira aparição de um efeito é um indício, mas não uma prova isolada.

Continue lendo

Ver arquivo

Usamos armazenamento necessário para funcionamento e segurança. Com sua autorização, ativamos medição de audiência, personalização e recursos publicitários opcionais.

Necessários Sempre ativos para segurança, sessão, idioma, tema e registro da sua escolha. Analytics Permite medir audiência, navegação e desempenho para melhorar o conteúdo e a experiência. Personalização Permite adaptar conteúdo, preferências e experiências com base nas suas escolhas. Marketing Permite usar armazenamento publicitário, personalizar anúncios e realizar medição completa.

Instalar a Rota42

No iPhone ou iPad, abra a Rota42 no Safari e siga estes passos:

  1. Toque em Compartilhar no menu do Safari.
  2. Escolha “Adicionar à Tela de Início”.
  3. Ative “Abrir como App da Web” e toque em Adicionar.