Otimização em Unity: fazendo seu jogo rodar no PC da sua avó
-
Upload
bruno-ferreira -
Category
Engineering
-
view
1.780 -
download
2
description
Transcript of Otimização em Unity: fazendo seu jogo rodar no PC da sua avó
Otimização em UnityFazendo seu jogo rodar no PC da sua avó
Otimização em UnityFazendo seu jogo rodar no PC da sua avó
(e no celular da sua avó)
Como?E quais os problemas mais comuns?
Problemas de otimização• Abuso de iluminação dinâmica• Muitas draw calls• Muitos objetos na cena• Muitos vértices e polígonos por
objeto• Texturas com resolução muito
alta
• Shaders pesados• Muitas texturas diferentes• Muitas malhas diferentes• Tamanho final do build muito
grande• Abuso de features gráficas:
sombras, pós-processamento• Scripts lentos
Nível 1Aproveitando o que a Unity tem a oferecer
Lightmaps & Light Probes• Lightmaps
• Cálculo de luz em tempo de projeto
• Prós• Número arbitrário de luzes• Permite efeitos complexos• Custo baixíssimo em runtime
• Contras• Só funciona em objetos estáticos
Lightmaps & Light Probes• Light probes
• Aproximação de luz global paraobjetos dinâmicos
• Prós• Melhora iluminação em objetos dinâmicos• Funciona com shaders padrão e é fácil de
adicionar nos seus shaders
• Contras• Menos preciso• Informação de luz de baixa frequência
Static & Dynamic batching• Batching: combina objetos que utilizam mesmo material em uma
única draw call
• Static batching• Combinação em tempo de projeto para objetos estáticos
• Dynamic batching• Funciona automagicamente em runtime com todos os objetos• Porém, tem um custo mais alto de CPU
Occlusion culling• Desliga o rendering de objetos que estão totalmente ocludidos por
outros na cena
• Requer pré-cálculo e ajuste em tempo de projeto
• Oclusores precisam ser estáticos, mas ocludidos podem ser dinâmicos
Nível 2Otimização na criação de Assets
Cuidados constantes na criação• Contagem de polígonos e vértices
• Personagens e cenário• Escolher onde gastar seu “orçamento”• Trade-offs entre complexidade na malha e no shader• Malha usada na física
• Resolução de texturas• Memória de vídeo é limitada• Escolher, de novo, onde gastar o orçamento• Tamanho da textura exibida na tela• Detalhes de alta frequência são uma ideia perigosa
Complexidade de shaders• Considerar o shader certo para cada situação
• Aquela peça de decoração não precisa de 5 mapas de detalhe + normal + specular + cubemap + AO
• Colocar um target estrito e baixo nos shaders…• Por exemplo, Shader Model 2.0• Garante um custo baixo• Incentiva programação bem otimizada
Shader Model 2.0
Texture Atlas• Assets que utilizam o mesmo
shader podem compartilhar o material…• Se suas texturas forem combinadas
em uma só
• Extremamente importante• Static & Dynamic Batching
Reutilização de assets• Model & texture once, use everywhere
• Reduz o custo de criação e de runtime• Menos malhas e texturas únicas• Menos memória• Especialmente relevante em mobile…
• Reutilização criativa evita a repetição
Nível 3Otimização de tamanho de arquivo
Utilizando assets com inteligência• Texturas
• Resolução• Compressão
• Som• Sample rate• Formato• Bitrate
• Malhas• Compressão• Remoção de polígonos inúteis
• Animações• Compressão• Reutilização
• Layers• Mixing Transforms• Animações aditivas
Asset bundles!
Trick Question• Qual o tamanho desta textura
no build?
• 512x512
• Diffuse + Normal
Trick Question• 2MB?
Trick Question• 2MB?• 1MB?
Trick Question• 2MB?• 1MB?• 512KB?
Trick Question• 2MB?• 1MB?• 512KB?• 256KB?
Trick Question• 2MB?• 1MB?• 512KB?• 256KB?• 128KB?
Trick Question• 2MB?• 1MB?• 512KB?• 256KB?• 128KB?• 64KB?
Trick Question• 2MB?• 1MB?• 512KB?• 256KB?• 128KB?• 64KB?• 32KB?
Trick Question• 2MB?• 1MB?• 512KB?• 256KB?• 128KB?• 64KB?• 32KB?• 16KB?
Trick Question• 2MB?• 1MB?• 512KB?• 256KB?• 128KB?• 64KB?• 32KB?• 16KB?• 8KB?
Trick Question• 2MB?• 1MB?• 512KB?• 256KB?• 128KB?• 64KB?• 32KB?• 16KB?• 8KB?• 4KB?
Trick Question• 2MB?• 1MB?• 512KB?• 256KB?• 128KB?• 64KB?• 32KB?• 16KB?• 8KB?• 4KB?
3,72KB
~20MB
~20MB (quase tudo lightmap)
Nível 4Soluções criativas
Sombras dinâmicas?
Sombras dinâmicas?Nope, Chuck Testa
Nível 4Cuidados com programação
Armadilhas na API da Unity• FindObject[OfType]
• GetComponent[s]InChildren
• GetComponent
• renderer.material
Cuidados gerais• Não refazer cálculos quando as entradas não mudam
• Calcule a primeira vez, guarde para consulta
• Não refazer o mesmo cálculo em vários lugares• Centralize o cálculo (por exemplo em um Manager)
• Distribuir cálculo pesado por vários frames• Exemplo: determinar visibilidade entre todos os jogadores• Tradeoff: desempenho X precisão• Quase sempre a precisão não precisa ser de um frame…
Mais alternativas• Desligar objetos “inúteis” para evitar gastar CPU
• Update, FixedUpdate• Física• Culling
• Multithreading para computação pesada• !!CUIDADO!! – API da Unity *NÃO* é thread-safe• Mas um bom isolamento de código vai longe
• Exemplo clássico: IA
Perguntas?Bruno “Tinnus” [email protected]@aquiris.com.br