O documento discute como otimizar shaders para melhorar o desempenho de fragment shaders. Inicialmente, os shaders causavam problemas de desempenho, exibindo menos de 10 fps em um iPad 4. Após várias otimizações, como reduzir acessos à textura e operações trigonométricas, o desempenho melhorou para mais de 60 fps em um iPad mini retina.
6. Tínhamos algumas opções
• Nosso artista fazer novas artes mudando a iluminação
• Íamos precisar ter essas artes na tela e fazer um blend durante a transição
• Nossa arte tem várias camadas e nosso jogo já gasta bastante memória
• Fazer algum shader para isso
• Temos bem pouca experiência com isso
12. Blur gaussiano?
• Isso só deixa a imagem borrada
• Queremos um efeito de bloom, não de blur.
• O que fizemos foi aplicar o filtro gaussiano só no alpha da textura e usar isso
para clarear a imagem
15. Performance deixando a desejar
• Menos de 10 fps num iPad 4
• Menos de 20 num iPad mini Retina
• Imagine num iPad 3, ou num android porcaria.
16. Não se pode otimizar o que não
se consegue medir
17. Não se pode otimizar o que não
se consegue medir
18. Não se pode otimizar o que não
se consegue medir
19. Não se pode otimizar o que não
se consegue medir
20. Problemas com o shader
• Muitas leituras dependentes de textura
• Nos dispotivos com A7 e A8 isso não é problema.
• Nos dispositivos antigos isso tem sérios problemas de performance
• Mesmo assim são muitas leituras de textura
• Muitas operações trigonométricas
• Muitas operações aritméticas em geral
21. Otimizações
• Reduzir o numero de acessos a textura
• Nossa imagem é afetada mais verticalmente que horizontalmente
• Nosso artista concordou que o efeito de bloom estava muito forte
• Talvez não seja bem verdade o resumo de quase nenhuma perda de qualidade
visual
• Mas essa parte era só metade do tempo.
24. Outras otimizações
• A performance ficou boa num iPad 4
• Mas poderíamos fazer os calculos de posição de textura no vertex shader
• Isso nos daria melhor performance em arquiteturas antigas
25. otimizações
• Reduzir as operações trignométricas
• Reduzir o número de operações executadas por pixel
28. Parece roubado
• O shader original faz várias coisas
• Converte de RGB para YIQ
• Encontra a Matiz do pixel
• Altera a Matiz
• Converte a Matiz modificada de volta para YIQ
• Converte o valor final YIQ para RGB
• No nosso caso, a mudança de matiz é a mesma para a camada toda
29. Matemática
• A operação toda é:
• Uma mudança de base
• Uma rotação
• A volta para a base original
• Essas operações são as mesmas para cada pixel da camada
• Cada uma delas pode ser escrita como uma multiplciação matriz vetor
• A operação toda pode ser escrita como uma multiplicação matriz vetor
• Calculamos a matriz na CPU e passamos como parametro para a GPU