Voltar para o Blog
Quest Log

Sprite Atlas na Unity: Menos Draw Calls no Jogo 2D

Dezenas de sprites de pixel art soltos se encaixando numa única folha quadrada dentro de uma janela de editor

Unity Sprite Atlas na prática: criar o atlas, ativar o modo V2, medir draw calls no Frame Debugger e dividir por cena e UI sem carregar sprite à toa.

Ferramenta:Unity

Sprite Atlas na Unity: Menos Draw Calls no Jogo 2D

O Unity Sprite Atlas junta vários sprites numa única textura para a GPU desenhar mais coisa por vez, com menos troca de textura entre um objeto e outro. Na prática: você cria um asset em Assets > Create > 2D > Sprite Atlas, arrasta as pastas de sprites para ele, confere o modo em Project Settings > Editor e mede o resultado no Frame Debugger. Aqui você monta isso numa cena 2D real, vê o número antes e depois e aprende a dividir os atlas para não carregar na memória sprite que a fase nem usa.

O último ponto é o que quase todo tutorial pula. Um atlas único com o jogo inteiro dentro parece otimização, mas é o jeito mais rápido de estourar memória no celular.

Por que o jogo 2D faz draw calls demais

Cada sprite que você importa vira uma textura separada. Quando a Unity desenha a cena, ela agrupa em lote os objetos que usam o mesmo material e a mesma textura. Toda vez que o próximo sprite usa outra textura, o lote quebra e começa um novo: mais uma chamada de desenho, mais uma troca de estado na GPU.

Numa cena com tileset, personagem, 15 inimigos, moedas, partículas e HUD, cada um vindo de um PNG diferente, a contagem sobe rápido. No PC você talvez nem perceba. No celular, o custo de CPU para preparar essas chamadas aparece em queda de FPS e em aquecimento.

Se você ainda não conhece a lógica de folha de sprites, vale ler o que é sprite sheet e como montar antes: o Sprite Atlas é a mesma ideia, só que montada pela engine a partir de sprites soltos, sem você ter que desenhar tudo numa folha só.

Sprite Atlas na Unity: criar e incluir pastas

O passo a passo no Unity 6.3 LTS:

  1. No Project, clique com o botão direito numa pasta (sugestão: Assets/Atlases) e escolha Create > 2D > Sprite Atlas. A Unity cria um arquivo .spriteatlasv2.
  2. Dê um nome que diga o uso: Atlas_Fase01, Atlas_UI, Atlas_Player.
  3. Selecione o atlas. No Inspector, na seção Objects for Packing, arraste uma pasta inteira (por exemplo, Sprites/Fase01). Também dá para usar o botão +.
  4. Clique em Pack Preview para ver a textura montada na janela de preview, no rodapé do Inspector.

Prefira incluir pastas em vez de sprites um por um. Quando você cria um sprite novo dentro da pasta, ele entra no atlas sozinho no próximo empacotamento. Lista manual de sprites esquece item novo, e você só descobre quando o Frame Debugger acusar uma quebra de lote que não deveria existir.

Duas opções do Inspector que mudam o resultado:

  • Include in Build: ligado, a Unity carrega o atlas e o associa aos sprites quando o jogo começa. Desligado, você precisa carregar o atlas por script (útil com Addressables ou para atlas que só existem em uma fase).
  • Type: Master é o atlas normal. Variant cria uma versão de resolução menor de um atlas Master, com o campo Scale (máximo 1). Serve para ter um atlas em meia resolução para aparelhos mais fracos.

Ativar Sprite Atlas V2 no Project Settings

Criar o atlas não basta: a Unity precisa estar configurada para empacotar. Vá em Edit > Project Settings > Editor e procure a seção Sprite Atlas. O campo Mode tem estas opções no Unity 6.3:

  • Disabled: não empacota nada. Seu atlas existe, mas o jogo usa as texturas soltas.
  • Sprite Atlas V1 - Enabled For Builds e Sprite Atlas V1 - Always Enabled: modo legado, só para projeto antigo que ainda não migrou.
  • Sprite Atlas V2 - Enabled: empacota no build e antes de entrar no Play. Use este durante o desenvolvimento.
  • Sprite Atlas V2 - Enabled For Builds: empacota só no build. A Scene view e o Play no editor mostram as texturas originais.

Para medir no editor, deixe em Sprite Atlas V2 - Enabled. Se o projeto veio de uma versão antiga com atlas V1, a Unity converte os assets para V2, mas a conversão não tem volta: faça backup ou commit antes.

Como dividir atlas: por cena, UI e personagem

Aqui está o erro caro. O raciocínio parece lógico: "se um atlas reduz draw calls, um atlas com tudo reduz mais". Só que, quando qualquer sprite do atlas é usado, a textura inteira vai para a memória. Um atlas de 4096 x 4096 com os cenários das 8 fases significa que a fase 1 carrega a arte da fase 8.

A regra que funciona: junte o que aparece na tela ao mesmo tempo.

  • Um atlas por fase ou bioma: tiles, props e fundo da Fase 1 num atlas, da Fase 2 noutro. Ao trocar de cena, a memória da fase anterior pode ser liberada.
  • Um atlas de UI: HUD, botões, ícones do inventário. Aparece em todas as cenas, então faz sentido ficar separado e sempre carregado.
  • Um atlas por personagem frequente: o jogador está em todas as fases, então os quadros de animação dele ficam num atlas próprio.
  • Inimigos por região: se o morcego só aparece na caverna, ele vai no atlas da caverna, não num atlas global de inimigos.

E siga o aviso da documentação: não coloque o mesmo sprite em dois atlas. A Unity escolhe um deles em tempo de execução sem garantia de qual, e você perde o controle do que está carregado.

Para saber se dividiu certo, use a medida da próxima seção: numa cena típica, a maior parte dos eventos de sprite deve vir de 2 ou 3 atlas. Se aparece uma dúzia, a divisão está fina demais. Se um atlas aparece mas só usa 10% da área, ele está grosso demais para aquela cena.

Montar atlas é a parte fácil. O difícil é o jogo inteiro: fase, inimigos, HUD, troca de cena e memória funcionando juntos sem você descobrir o gargalo só no celular de um jogador. É nesse ponto que muita gente trava estudando sozinha, porque cada tutorial ensina uma peça isolada e ninguém mostra como elas se encaixam num projeto que vai para a loja.

Curso de Unity
Quer fazer seu primeiro jogo na Unity?

No curso de Unity 6 da CursoGame.Dev você vai do zero ao primeiro jogo, com um desafio prático em cada level e suporte individual no WhatsApp quando travar.

Conhecer o curso de Unity
Suporte no WhatsAppAcesso vitalícioGarantia de 7 dias

Medir antes e depois no Frame Debugger

Otimização sem medida é chute. Faça este teste numa cena 2D típica (tilemap, personagem, alguns inimigos, HUD):

  1. Coloque o Mode em Disabled temporariamente.
  2. Dê Play e abra o painel Stats no canto da Game view. Anote Batches e SetPass calls.
  3. Abra Window > Analysis > Frame Debugger e clique em Enable. O jogo pausa no frame atual e a janela lista cada evento de desenho na ordem.
  4. Clique nos eventos de sprite. O painel de informações mostra a textura usada e explica por que aquele desenho não entrou no lote anterior. Em cena sem atlas, o motivo que mais aparece é textura diferente.
  5. Volte o Mode para Sprite Atlas V2 - Enabled, dê Play de novo e repita a leitura.

O que esperar: os sprites que estão no mesmo atlas passam a compartilhar a textura, então eventos consecutivos se juntam e os números do Stats caem. Quanto cai depende da sua cena. Se os sprites de atlas diferentes ficam intercalados na ordem de desenho (um inimigo do Atlas_Inimigos na frente de um tile do Atlas_Fase01, depois outro inimigo), o lote quebra do mesmo jeito.

Uma nota sobre o URP: com o 2D Renderer, o SRP Batcher também atua nos sprites e reduz o custo de CPU de cada chamada, mesmo quando o número de draw calls não cai tanto. Por isso, olhe os dois números (Batches e SetPass calls) e o tempo de CPU no Profiler, não um só. O atlas ataca a troca de textura, que é justamente o que o SRP Batcher não resolve. Para entender os outros tipos de lote, o post draw calls e batching na Unity aprofunda.

Padding, compressão e tamanho máximo

Os campos do Inspector que você vai mexer de verdade:

  • Padding: espaço em pixels entre um sprite e outro dentro do atlas. O padrão é 4. Se aparecer uma linha fina de outro sprite na borda do seu personagem, é falta de padding (ou filtro Bilinear puxando o pixel vizinho). Suba para 8.
  • Allow Rotation: deixa a Unity girar sprites para caber melhor. Desligue em atlas de UI do Canvas, porque a imagem pode aparecer girada.
  • Tight Packing: empacota pelo contorno do sprite (o Custom Outline do Sprite Editor) em vez do retângulo. Economiza espaço com sprites de formato irregular.
  • Filter Mode: em pixel art, Point (no filter). Em arte pintada, Bilinear.
  • Generate Mip Maps: desligado em quase todo jogo 2D com câmera fixa. Mipmap em atlas aumenta a chance de vazamento entre sprites.
  • Max Texture Size (aba Default): o tamanho máximo da folha. Se o conteúdo não cabe, a Unity gera mais de uma página, e cada página é uma textura. 2048 é um bom teto para mobile.
  • Format e Compression: com Format em Automatic, escolha a qualidade de compressão. Em pixel art, compressão forte cria artefato visível; teste High Quality ou None no atlas do personagem e compressão normal nos fundos.

Use também as abas de plataforma para sobrescrever tamanho e formato no Android e no iOS sem mexer na versão de PC.

Erros comuns: atlas que não empacota no editor, sprite borrado

"O atlas não aparece no Frame Debugger." Confira o Mode no Project Settings. Em Enabled For Builds, o editor usa as texturas soltas, e o Frame Debugger mostra o mesmo número de antes. Para o teste, use Sprite Atlas V2 - Enabled.

"O sprite ficou borrado depois do atlas." O atlas tem configurações próprias de textura que sobrescrevem as do sprite original. Se o sprite era Point e o atlas está Bilinear, o resultado no jogo é borrado. Ajuste o Filter Mode e a compressão no próprio atlas.

"Aparece uma linha de outro sprite na borda." Padding baixo ou mipmap ligado. Suba o padding e desligue Generate Mip Maps.

"O botão da UI apareceu girado." Allow Rotation ligado num atlas usado pelo Canvas. Desligue.

"O atlas ficou com metade vazia." Sprites com Secondary Textures (normal map, mask) em quantidades diferentes no mesmo atlas geram espaço vazio. Agrupe sprites que usam as mesmas texturas secundárias.

"Os números não mudaram nada." Verifique a ordem de desenho. Se o Sorting Layer intercala sprites de atlas diferentes, o lote quebra a cada troca. Sprite Mask e Sorting Group também costumam separar lotes.

Próximo passo

Pegue uma cena do seu projeto, anote Batches e SetPass calls com o atlas desligado, crie três atlas (fase, UI e jogador) e meça de novo. Se o número não caiu, o Frame Debugger vai te dizer exatamente qual evento está quebrando o lote. Depois disso, o próximo gargalo do 2D costuma ser física, scripts com alocação por frame e partículas, assuntos do guia de otimização de performance para 60 FPS.

Perguntas frequentes

Sprite Atlas reduz draw calls mesmo com o URP e o SRP Batcher?

Reduz o trabalho de troca de textura, que é o que o SRP Batcher não resolve sozinho. Sprites de texturas diferentes quebram o lote; dentro do mesmo atlas, eles compartilham a textura e podem ser desenhados juntos. Meça no Frame Debugger e no painel Stats, porque o número exato depende da ordem de desenho e dos materiais.

Por que o Sprite Atlas não aparece no editor, só no Play?

Provavelmente o modo em Project Settings > Editor > Sprite Atlas está como "Sprite Atlas V2 - Enabled For Builds". Nesse modo a Unity só empacota no build, então a Scene view mostra as texturas originais. Use "Sprite Atlas V2 - Enabled" para empacotar também ao entrar no Play.

Qual padding usar no Sprite Atlas?

O padrão é 4 pixels e serve para quase todo jogo. Se aparecer borda de um sprite vazando no vizinho (comum com filtro Bilinear ou mipmaps), aumente para 8. Em pixel art com Point e sem mipmaps, 2 a 4 costuma bastar.

Posso colocar o mesmo sprite em dois atlas?

Evite. A documentação da Unity avisa que, nesse caso, a engine escolhe um dos atlas sem garantia de qual. Se você precisa de controle, carregue o atlas manualmente em tempo de execução.