SWCore / Animações / Pré-carregamento

Pré-carregamento Animações

A diferença entre baixar bytes da rede e decodificar em pixels na memória — trocas visuais em 0ms sem engasgo ou tela piscando.

O que é

Um arquivo de imagem comprimido (WebP, JPG ou PNG) chega da rede como uma “mala fechada”. Antes de exibi-la sem travar a animação, o navegador precisa abrir o arquivo e decodificar cada pixel na memória de vídeo (RAM/VRAM). Pré-carregar significa fazer o download e o image.decode() nos bastidores, antes do visitante precisar ver a imagem.

Como funciona

O ciclo de uma imagem perfeita segue 4 etapas: 1. Baixar (os bytes comprimidos viajam pela rede) → 2. Decodificar (o método assíncrono image.decode() descompacta a matriz de pixels fora da thread principal) → 3. Guardar (os pixels prontos ficam guardados na memória) → 4. Exibir (a substituição visual acontece em 0ms, sem layout shift nem congelamento de tela).

Exemplos

00 · O Pipeline de 4 Etapas (Modelo Mental) Ao vivo
01
Baixar

O arquivo comprimido (ex: 120 KB WebP) atravessa a rede.

02
Decodificar

image.decode() descompacta a matriz em pixels RGBA.

03
Guardar

Os pixels prontos ficam alocados em memória de vídeo.

04
Exibir

A troca visual acontece em 0ms sem nenhuma piscada.

<!-- 
  O navegador não desenha arquivos comprimidos diretamente:
  01. Baixar (Rede) -> 02. Decodificar (decode()) -> 03. Guardar (RAM) -> 04. Exibir (0ms)
-->
01 · Comparador Real: Sem Preparo vs Com Pré-carregamento Ao vivo
SEM PRÉ-CARREGAMENTO Espera na tela
A imagem ainda não foi pedida.
(Clique no botão abaixo para pedir)
Clique Download + Decode Imagem
COM PRÉ-CARREGAMENTO 0ms de engasgo
Pré-carregue primeiro nos bastidores.
Preparar antes Clique Exibição em 0ms
<!-- Comparação real de carregamento: na hora vs nos bastidores com decode() -->
<script>
  // 1. Sem pré-carregar: cria e insere direto na hora
  const imgDireta = new Image();
  imgDireta.src = 'foto.webp';
  palco.replaceChildren(imgDireta);

  // 2. Com pré-carregamento real:
  const imgPronta = await SWMotion.preloadImage('foto.webp');
  palco.replaceChildren(imgPronta); // Troca instantânea em 0ms!
</script>
02 · Pré-carregamento de Lote com Barra de Progresso Real Ao vivo
Pré-carregamento em Lote (Galeria)
Baixa e decodifica 3 imagens de alta resolução em paralelo
0 de 3 imagens prontas 0%
<!-- Pré-carregamento de múltiplos recursos com acompanhamento em tempo real -->
<button type="button" class="sw-btn sw-btn-pri" id="btn-batch">Pré-carregar Galeria</button>

<script>
  const fotos = [
    'amber-chair.webp',
    'architecture.webp',
    'chrome-desert.webp'
  ];

  await SWMotion.preloadImages(fotos, (loaded, total, url, img) => {
    const porcento = Math.round((loaded / total) * 100);
    console.log(porcento + '% (' + loaded + '/' + total + ')');
  });
</script>
03 · Calculadora de Memória Descompactada (RAM / VRAM) Ao vivo
Calculadora de Consumo na Memória

Veja por que não devemos pré-carregar dezenas de fotos de uma vez só:

MEMÓRIA RAM / VRAM OCUPADA:
33.18 MB
Na rede são apenas ~480 KB comprimidos, mas na GPU ocupam 33.18 MB descompactados.
<!-- 
  Cálculo de consumo real na memória de vídeo:
  Largura (px) × Altura (px) × 4 bytes (RGBA)
  Exemplo: 1920 × 1080 × 4 = 8.294.400 bytes (~8.29 MB de RAM)
-->
04 · Padrão de Produção com Tratamento de Erro (Fallback) Referência
// Template completo com fallback se o download ou decode falhar
try {
  const img = await SWMotion.preloadImage('hero-banner.webp', 'Banner Principal');
  document.getElementById('palco-hero').replaceChildren(img);
} catch (error) {
  console.warn('Falha no pré-carregamento:', error);
  // Fallback: mostra imagem estática básica ou cor de fundo
}

Atributos

Nenhum.

Variantes

Comparador Lado a Lado
Demonstração em tempo real da diferença entre carregar na hora versus pré-carregar nos bastidores
Carregamento em Lote
Download e decodificação paralela de múltiplas imagens com barra de progresso em tempo real
Calculadora de Memória
Cálculo da memória RAM/VRAM descompactada (largura × altura × 4 bytes RGBA)

Eventos

Nenhum.

API (JavaScript)

SWMotion.preloadImage(src, alt)
Baixa e decodifica assincronamente uma imagem via image.decode(), retornando uma Promise com o elemento <img> pronto para exibição instantânea.
SWMotion.preloadImages(urls, onProgress)
Pré-carrega um lote de imagens em paralelo com callback de progresso em tempo real (loaded, total, url, img).

Requisitos

  • O método image.decode() é suportado nativamente em todos os navegadores modernos (Chrome, Firefox, Safari, Edge). O SWCore possui fallback automático caso o método não esteja disponível.

Limitações — o que ele não faz

  • Custo de memória de vídeo é real: 4 imagens de 1920×1080px descompactadas ocupam ~33 MB de memória RAM/VRAM, mesmo pesando apenas 400 KB comprimidas na rede.
  • A regra de ouro é pré-carregar de forma estratégica (apenas a próxima seção ou os próximos 2 slides), e não todas as imagens do site de uma só vez.