Como o Photoshop resolveu o trabalho com arquivos maiores que couberem na memória

Saiba como a Adobe conseguiu permitir que os usuários editem até mesmo os maiores arquivos na versão da Web do seu icônico aplicativo Photoshop.

Nabeel Al-Shamma
Nabeel Al-Shamma

Introdução

Este artigo também está disponível na forma de vídeo.

Em 2021, a Adobe e a engenharia do Chrome disponibilizaram uma versão do Photoshop para a Web. O software faz uso inovador do WebAssembly com recursos como SIMD, armazenamento de alto desempenho no sistema de arquivos privados de origem, o espaço de cores P3 para canvas e Web Components com Lit. Neste artigo, queremos nos concentrar em como a engenharia do Adobe Photoshop resolveu o trabalho com arquivos maiores que couberem na memória. E, no caso do WebAssembly, como o Photoshop funciona com arquivos maiores que o espaço de endereço de 32 bits de wasm32.

O app Photoshop ao editar uma imagem do logotipo do Projeto Fugu.

O problema

Abrir um arquivo para edição requer uma grande quantidade de memória, muito mais do que abrir um arquivo para visualização. Os arquivos editados no Photoshop geralmente exigem mais memória do que um usuário tem disponível em seu dispositivo, devido aos muitos recursos oferecidos pelo software, aos tipos de design e edição digital usados e aos recursos dos dispositivos do usuário.

O formato de arquivo do Photoshop armazena dados com compactação sem perdas. Quando um arquivo ou documento é lido, todos os dados da imagem são descompactados para permitir um processamento mais eficiente. Como resultado, a quantidade de memória necessária pode ser várias vezes maior do que a quantidade de espaço que um documento usa em disco ou em armazenamento em nuvem.

O Photoshop é compatível com um histórico de desfazer ações muito grande. Muitas operações no Photoshop são o que chamamos de operações destrutivas. Ou seja, uma edição como a pintura com um pincel resulta em novos dados de pixel, que podem ser tão grandes quanto os dados de pixel originais. Fazer essas edições em uma sessão longa gera grandes quantidades de dados de pixel que devem ser mantidos para oferecer suporte para operações de desfazer. Assim, o histórico pode crescer para várias centenas de megabytes ou muitos gigabytes de dados.

A memória é gerenciada por dispositivos e plataformas, sejam computadores, dispositivos móveis ou navegadores. Alguns são mais generosos que outros em relação à quantidade de memória que disponibiliza aos aplicativos. A quantidade de memória também varia de dispositivo para dispositivo, já que você sabe quando compra um novo computador ou dispositivo e especifica a quantidade de memória de acesso aleatório (RAM) desejada. Muitas dessas plataformas também oferecem suporte à memória virtual, o que permite que um aplicativo use mais memória do que a disponível fisicamente. Essa compatibilidade varia de acordo com o sistema operacional e o tempo de execução, como no caso do WebAssembly, pode não ser prontamente acessível ou utilizável pelos aplicativos. Além disso, os sistemas virtuais modernos têm limites superiores que são facilmente excedidos pelos requisitos do Photoshop.

O ideal é que os aplicativos usem a quantidade de memória necessária. Isso geralmente permite oferecer o melhor desempenho aos usuários. No entanto, se usarem muita memória, eles poderão ser penalizados pela plataforma de execução ou ficar sem memória, resultando em falhas.

Como ponto histórico, o problema original que o Photoshop precisava resolver era a edição de arquivos de resolução de impressão nas primeiras versões do macOS, que eram de apenas 1 MB no SO e em todos os aplicativos. Uma imagem de página inteira de 300 dpi em CMYK tem aproximadamente 32 MB não compactada.

A solução

Para resolver o problema do aplicativo que excede a quantidade de RAM disponível, o Photoshop implementou um sistema de memória virtual (VM, na sigla em inglês) de software. O Photoshop usa uma VM para gerenciar dados de documentos, especialmente dados de imagem, todo o histórico de desfazer ações e o estado, bem como o armazenamento em funcionamento do comando atual. Também é usado para armazenar grandes blocos de dados em cache, como descrições de pincéis, para que eles só precisem ser serializados a partir do disco uma vez.

Como exemplo de um dos aspectos gerenciados pela VM, os dados de imagem são armazenados usando uma representação mipmap, que é um conjunto em forma de pirâmide de blocos, fornecendo dados de imagem em um intervalo de resoluções baixa a alta. Isso permite que o Photoshop opere nos dados de resolução adequados para uma resposta mais rápida quando o zoom for aumentado ou olhe para uma visualização, em comparação com o zoom diminuído.

Exemplo de armazenamento de imagens de mipmap: a imagem principal à esquerda é acompanhada por cópias filtradas de tamanho reduzido.

Durante a inicialização do aplicativo, o Photoshop determina a quantidade de RAM disponível. Ela reserva uma parte para que os dados sejam armazenados na VM. A RAM restante está disponível para outras necessidades do aplicativo pela biblioteca C++ de ambiente de execução padrão. A memória da VM é dividida em páginas. Normalmente, cada página é um múltiplo do tamanho da página de hardware do dispositivo. Quando usada para dados de imagem, a memória é referenciada como blocos. Um bloco é uma área quadrada de pixels de uma única camada, incluindo limites geométricos. Um bloco consome uma ou mais páginas.

O Photoshop cria um ou mais arquivos de trabalho para oferecer backup baseado em disco para páginas de VM. Esses arquivos de rascunho são armazenados no sistema de arquivos particular de origem. A captura de tela mostra um exemplo de hierarquia de um arquivo de rascunho (destacado em amarelo) e outros arquivos durante uma sessão de edição de imagem. Cada arquivo de rascunho pode conter muitas páginas de VM. Quando a VM precisa de mais apoio, ela cria outros arquivos de rascunho. À medida que as páginas são liberadas, o espaço em um arquivo de rascunho pode ser reutilizado para páginas novas.

Inspeção da hierarquia de arquivos do sistema de arquivos privados de origem do Photoshop com a extensão do Chrome do OPFS Explorer.

Ao processar dados de imagem, o Photoshop itera sobre os blocos, realizando cálculos de pixels. Cada cálculo pode fazer referência a vários blocos. A VM é responsável por garantir que os blocos de origem e destino da iteração atual estejam na memória, carregando-os de arquivos do zero conforme necessário. Ao mesmo tempo, ele pode transferir páginas para os arquivos de rascunho para liberar espaço na memória.

Conclusões

Os detalhes concretos de implementação da VM vão muito além do escopo deste documento e são de propriedade da Adobe. Porém, com a descrição detalhada da solução, você entende como o Photoshop lida com arquivos grandes. O sistema de arquivos privados de origem, com alto desempenho no acesso de leitura e gravação, é um componente essencial da solução.

Agradecimentos

Esta postagem do blog foi revisada por Oliver Unter Ecker e Rachel Andrew. Agradecimentos especiais a Russell Williams por sua excelente documentação sobre a VM do Photoshop.