o composite entra. O navegador passa a responsabilidade para a GPU processando isso de forma separada. Mas para otimizar a animação o navegador precisa de três coisas:
receber valores relativos que dependem do tamanho do elemento do pai As únicas propriedades que atendem as condições anteriores são transform e opacity
Para cada composite layer é criada uma imagem Preparar as informações de cada layer Preparar os shaders para a animação (se for aplicável) Enviar para a GPU Então nós temos um problema É necessário animar tudo? Como a animação pode ser feita de modo menos “custoso"?
extra A container__section-two não está animada, mas o navegador cria uma camada extra, pois a container__section-two fica acima da container__section-one. Uma camada extra que cria um processo de repaint pesado
de memória e processamento de GPU) Quanto mais camadas criadas mais “imagens” são criadas pelo navegador O navegador precisa desenhar cada pixel na tela e isso tem um custo pra GPU que tem que processar toda a UI
um array de pixels E esse array de pixels tem um peso na memória 200 x 200 x 3 = 120.000 bytes O navegador multiplica a altura pela largura e depois multiplica por 3 O 3 representa o RGB, se contém áreas transparentes se multiplica por 4 (RGBa) 200 x 200 x 4 = 160.000 bytes 160.000 x 3 = 480.000 bytes
com tamanho de 400x400 pixels Vamos imaginar colocar uma transição suave entre as imagens utilizando transform: translateX 400 x 400 x 4 = 640.000 bytes 640.000 x 5 = 3.200.000 bytes 3.2Mb Agora imagine uma SPA com diversos efeitos animados, microinterações, imagens com alta resolução, etc
seja um problema Em computadores mais antigos e smartphones intermediários isso pode se tornar um grande problema Boa parte destes dispositivos tem 1 ou 2gb de memória disponível Memória que é dividida com processos do sistema operacional, do próprio navegador, processos em background, entre outras coisas
video, canvas, animar elementos fora da ordem do markup podem causar implicit composite Definir os elementos que serão animados com z-index, isso evita repaint. Use a propriedade will-change (com parcimônia)
na sua experiencia. O processo de paint/repaint é muito mais utilizado do que a gente imagina, o devtools é nosso amigo, use à vontade para metrificar tudo. (layers e repaint tabs) Se você precisa de mais do que transform e opacity pra fazer sua animação, repense ela