Analisando o estado das imagens progressivas e a percepção do usuário

Publicados: 2022-03-10
Resumo rápido ↬ Todos nós queremos carregar imagens rapidamente na web. Escolher o formato de imagem correto, otimizar a qualidade e usar imagens responsivas são tarefas importantes, mas o que podemos fazer além disso?

“Imagens progressivas” é um tema quente nos dias de hoje. Frequentemente encontramos artigos explicando técnicas sobre como evitar a exibição de um espaço vazio onde uma imagem será carregada. Medium e Facebook são exemplos de sites e aplicativos móveis que aplicam esse padrão.

Recentemente, escrevi sobre diferentes maneiras de usar SVG como espaços reservados, e o Calendário de Desempenho do PerfPlanet deste ano incluiu duas postagens que descrevem melhor o SQIP, uma técnica baseada em SVGs desfocados: Carregamento progressivo de imagens usando Intersection Observer e SQIP e SQIP — Vague Vectors for Performant Previews.

Quando documentei pela primeira vez a técnica de carregamento de imagens do Medium, eu estava mais interessado na engenharia reversa da técnica. Eu tinha visto o efeito de navegar no Medium em uma conexão lenta a bordo. Achei que renderizar uma pequena imagem cedo, carregar lentamente e fazer a transição para a versão final era uma boa ideia.

Assumimos que essas técnicas melhoram o desempenho percebido do usuário . A renderização rápida supera a renderização lenta. Colocar algo na tela do usuário antecipadamente, mesmo que não seja o conteúdo final.

Temos certeza disso?

Passando por alguns comentários no Reddit, encontrei muitas opiniões perspicazes (e negativas). Aqui estão dois deles:

“Eu odeio sites que mostram uma versão borrada de uma imagem antes que a final seja carregada. Ele brinca com meus olhos. Eu tenho que desviar o olhar e espiar para ver se está feito antes que eu possa ler. Eu gostaria que houvesse uma maneira de desativar essa funcionalidade."
— rocky1138, notícias de hackers
“Como as pessoas chegaram à conclusão de que exibir uma versão de baixa informação da imagem a ser carregada como um espaço reservado resulta em uma carga percebida mais rápida? Para mim, todos esses efeitos parecem lixo e distraem, sem nenhum benefício – certamente não a percepção de velocidade. Não é como se eu pudesse entender o que a imagem realmente é antes de estar totalmente carregada de qualquer maneira, com nosso espaço reservado sem fantasia."
— dwb, notícias de hackers
Mais depois do salto! Continue lendo abaixo ↓

Tentando encontrar estudos sobre a percepção dos usuários

Eu queria encontrar alguma pesquisa científica que pudesse apoiar que essas técnicas para carregar imagens fossem (ou não) benéficas. Isso provou ser um desafio. Não encontrei nenhum estudo provando que mostrar algo como uma miniatura borrada antes que a imagem seja carregada melhora a percepção do usuário. Então pensei em JPEGs progressivos.

De volta à base: JPEGs progressivos

De certa forma, temos uma “técnica de carregamento progressivo de imagens” semelhante apoiada em imagens há muito tempo. O JPEG progressivo é um bom exemplo.

JPEGs progressivos foram propostos como uma boa prática para imagens, especialmente para sites usados ​​em redes lentas. Ann Robson escreveu um post encorajando os JPEGs Progressivos, agora há cinco anos, onde resumiu por que eles eram superiores:

“Os JPEGs progressivos são melhores porque são mais rápidos. Parecer mais rápido é ser mais rápido, e a velocidade percebida é mais importante que a velocidade real . Mesmo que estejamos sendo gananciosos com o que estamos tentando entregar, os JPEGs progressivos nos dão o máximo possível o mais rápido possível."

Um JPEG progressivo codifica a imagem em várias digitalizações. A primeira varredura renderiza a imagem completa em baixa qualidade e é refinada à medida que mais varreduras são renderizadas. Uma alternativa é o modo de linha de base do JPEG no qual a imagem é decodificada de cima para baixo.

Decodificação de linha de base de uma imagem JPEG
Decodificação de linha de base de uma imagem JPEG.
Decodificação progressiva de uma imagem JPEG
Decodificação progressiva de uma imagem JPEG.

Como observação lateral, a codificação JPEG pode ser personalizada usando diferentes scripts de verificação. Isso pode ser usado para criar imagens codificadas em um modo híbrido entre linha de base e progressiva.

Técnicas progressivas como Blur-up, SQIP se assemelham a JPEGs progressivos do ponto de vista da percepção do usuário. O navegador renderiza uma imagem de baixa qualidade primeiro e a substitui pela imagem final quando é carregada.

Curiosamente, a grande maioria das imagens JPEG usa o modo de linha de base. Segundo algumas fontes, os JPEGs progressivos representam no máximo 7% de todos os JPEGs. Se parecemos concordar que essas técnicas melhoram o desempenho percebido pelo usuário, por que os JPEGs progressivos não são usados ​​mais amplamente do que os JPEGs básicos?

O estudo

Só encontrei um estudo chamado “Progressive Image Rendering - Good or Evil?”, que tentou lançar alguma luz sobre este tema.

“Quando, como no método JPEG progressivo, a renderização de imagem é um processo de dois estágios no qual uma imagem inicialmente grosseira se encaixa em foco nítido, a fluência cognitiva é inibida e o cérebro precisa trabalhar um pouco mais para entender o que está sendo exibido. .”

De acordo com o estudo, os usuários acham mais difícil processar JPEGs progressivos, mesmo que à primeira vista achemos que a experiência é melhor.

Recentemente, mencionei o estudo em uma conversa sobre LQIP (Low-Quality Image Placeholders). Logo, obtive algumas respostas questionando o rigor do estudo:

Até agora, temos um único estudo que é recebido com ceticismo. O que mais nos temos? Podemos usar as ferramentas existentes para medir o desempenho percebido como um proxy?

Medindo o tempo de carregamento percebido

Imagine essas duas tiras de filme hipotéticas gravadas de um site:

Um diagrama mostrando 2 tiras de filme hipotéticas para o mesmo local. A versão A renderiza páginas em branco e todo o conteúdo de uma vez. A versão B mostra o conteúdo parcial à medida que carrega.
Um diagrama mostrando 2 tiras de filme hipotéticas para o mesmo local.

O acordo geral é que o usuário perceberá que a Versão B carrega mais rápido que a Versão A. Isso ocorre porque partes da página são renderizadas antes da Versão A.

De certa forma, a situação é semelhante à das imagens progressivas, mas em maior escala. Conteúdo parcial o quanto antes, mesmo não sendo o final.

Um tempo de carregamento de página de 1,2 segundos nos conta parte da história, mas não descreve o que o usuário vê durante esse tempo. Atualmente, usamos métricas como o Índice de velocidade para avaliar a velocidade de carregamento de uma página. O Índice de velocidade mede a área da página que não está visualmente completa. Isso é feito em várias capturas de tela tiradas em intervalos. Quanto menor o número, melhor.

Fórmula do índice de velocidade
Fórmula do índice de velocidade (Fonte)

Se pensarmos em técnicas de carregamento progressivo de imagens, como o Índice de velocidade varia à medida que a imagem é carregada? Essa área será considerada “visualmente concluída” se usarmos um espaço reservado de baixa qualidade?

Inicialmente, o Índice de Velocidade mediu o progresso comparando a distância dos histogramas, um para cada cor primária (vermelho, verde, azul). Isso é chamado de diferença média do histograma. O objetivo é evitar que alterações como refluxos, em que todos os elementos da página são deslocados alguns pixels, tenham um grande impacto no cálculo. Para obter mais informações sobre o algoritmo, leia a seção Medindo o progresso visual do documento Índice de velocidade.

Decidi experimentar o Webpagetest em uma página que exibe marcadores de posição de baixa qualidade (consulte o relatório no WebPageTest):

Tira de filme mostrando a porcentagem de integridade visual
Tira de filme mostrando a porcentagem de integridade visual (consulte o relatório no WebPageTest).

Podemos notar que entre os segundos 8 e 10 a imagem carrega. O espaço reservado embaçado aumenta a porcentagem de integridade visual de 75% para 83%. Carregar a imagem final leva de 83% a 93%.

Vemos que um espaço reservado contribui para a integridade visual da página conforme medido pelo Índice de velocidade. Também podemos observar que o placeholder não conta como uma área totalmente visualmente completa.

O Índice de velocidade não é a única métrica que podemos usar para medir a rapidez com que nossa página é renderizada. As Ferramentas do desenvolvedor do Chrome incluem uma opção para fazer uma auditoria de desempenho. Vá para AuditsPerform an auditCheck 'Performance'Run audit .

A execução de uma auditoria gera um relatório como este:

Uma foto de um telefone carregando uma história no Medium, mostrando um espaço reservado desfocado.
Carregando uma história no Medium. Observe que o espaço reservado da imagem borrada que mais tarde se desvanece na imagem final.

Uma das métricas relatadas é o “Índice de velocidade perceptiva”. Nesta execução o valor é 4,245 . Mas o que exatamente esse termo significa? É o mesmo que o “Índice de Velocidade” do Webpagetest?

A abordagem do Speed ​​Index para medir a similaridade de pixel, também chamada de “Mean Histogram Difference”, tem algumas desvantagens. O MHD não captura a percepção visual de forma, cor ou similaridade de objetos.

Quatro formas diferentes com igual quantidade de pixels pretos e brancos.
Quatro formas diferentes com igual quantidade de pixels pretos e brancos.

Na maioria dos casos, isso não fará uma grande diferença ao executar uma avaliação de integridade visual. Na prática, tanto o Índice de Velocidade quanto o Índice de Velocidade Perceptiva possuem uma alta correlação:

“Em estudos empíricos de grande escala que conduzimos (usando mais de 500 vídeos de páginas da web móveis do Alexa coletados via WebPagetest), descobrimos que SI e PSI são linearmente correlacionados (em 0,91, para ser preciso).” — Índice de velocidade perceptiva (PSI) para medir o desempenho da Web acima da dobra

Índice de velocidade perceptiva

De acordo com a documentação do Lighthouse do Google, o Índice de velocidade perceptual é calculado usando um módulo de nó chamado Speedline. Este pacote calcula o índice de velocidade perceptual, com base no mesmo princípio do índice de velocidade original, mas calcula a progressão visual entre quadros usando o SSIM em vez da distância do histograma .

O SSIM (Structural Similarity) é usado para medir a semelhança entre duas imagens. Este método tenta modelar como os seres humanos percebem as imagens, capturando a forma, a cor e a semelhança dos objetos. O SSIM tem outras aplicações interessantes: Uma delas é otimizar as configurações de compactação de imagem, como cjpeg-dssim, que escolhe o nível de compactação JPEG mais alto e gera uma imagem com um SSIM próximo o suficiente.

Abaixo, você pode ver as pontuações do Image SSIM JS para imagens SVG criadas usando o Primitive. Quanto mais formas usamos, mais próximo fica da imagem original (SSIM = 1).

Duas imagens reproduzidas usando 100 e 10 triângulos. Mais formas tornam a imagem mais semelhante à original.
Duas imagens reproduzidas usando triângulos. Mais formas tornam a imagem mais semelhante à original.

Alternativas mais recentes ao SSIM são butteraugli (usado por Guetzli, o codificador JPEG Perceptually Guided do Google) e SSIMULACRA (usado por Cloudinary).

Conclusão

Não há uma maneira simples de sintetizar a percepção de um usuário sobre o carregamento de uma imagem ao longo do tempo. Somos movidos pelo pressentimento de que mostrar antes é melhor, mesmo que não seja o conteúdo final, embora alguns usuários discordem.

Como desenvolvedores, precisamos medir o desempenho . É a única maneira de definirmos metas para melhorá-lo e saber quando não atingimos um orçamento de desempenho. A vantagem de apostar no carregamento progressivo de imagens é que podemos medi-lo com ferramentas baseadas na percepção do usuário. Eles nos dão uma pontuação, são reproduzíveis e escaláveis. Eles se encaixam em nosso fluxo de trabalho e ferramentas e estão aqui para ficar.

Como desenvolvedores da web, devemos nos preocupar mais com a experiência de carregamento dos sites que construímos. É ótimo que agora tenhamos ferramentas como WebPageTest e Lighthouse que podem nos ajudar a medir facilmente o efeito do uso de técnicas de carregamento progressivo de imagens. Não há mais desculpas!