otimização em unity: fazendo seu jogo rodar no pc da sua avó

Post on 09-Jul-2015

1.780 Views

Category:

Engineering

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Palestra sobre otimização em Unity e dicas gerais para criação de assets para jogos extraindo o máximo de performance.

TRANSCRIPT

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” Ferreiratinnus@gmail.combruno.ferreira@aquiris.com.br

top related