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

Saiba como a Adobe conseguiu permitir que os usuários editassem até mesmo os arquivos maiores na versão da Web do app Photoshop.

Este artigo também está disponível em formato de vídeo.

Em 2021, a Adobe, em parceria com a equipe de engenharia do Chrome, lançou uma versão do Photoshop para a Web. O software usa de forma inovadora a WebAssembly com recursos como SIMD, armazenamento de alta performance no sistema de arquivos particular de origem, o espaço de cores P3 para tela e os componentes da Web com Lit. Neste artigo, vamos nos concentrar em como a equipe de engenharia do Adobe Photoshop resolveu trabalhar com arquivos maiores do que cabem 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 do wasm32.

O app Photoshop editando uma imagem do logotipo do Project 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 no dispositivo devido aos muitos recursos oferecidos pelo software, aos tipos de design e edição digital para os quais ele é usado 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 descomprimidos para permitir um processamento mais eficiente. Como resultado, a quantidade de memória necessária pode ser várias vezes maior do que o espaço que um documento usa no disco ou no armazenamento em nuvem.

O Photoshop oferece suporte a um histórico de desfazer muito grande. Muitas operações no Photoshop são chamadas de operações destrutivas. Ou seja, fazer uma edição, como pintar com um pincel, vai resultar em novos dados de pixels que podem ser tão grandes quanto os dados originais. Fazer essas edições em uma sessão de edição longa gera grandes quantidades de dados de pixel que precisam ser mantidos para oferecer suporte a operações de desfazer. Assim, o histórico pode crescer para várias centenas de megabytes ou muitos gigabytes de dados.

Dispositivos e plataformas, sejam máquinas de mesa, dispositivos móveis ou navegadores, gerenciam a memória. Alguns são mais generosos que outros na quantidade de memória que disponibilizam para os aplicativos. A quantidade de memória também varia de dispositivo para dispositivo, como você sabe quando compra um computador ou dispositivo novo e especifica a quantidade de memória de acesso aleatório (RAM) desejada. Muitas dessas plataformas também oferecem suporte à memória virtual, que permite que um aplicativo use mais memória do que está fisicamente disponível. Esse suporte varia de acordo com o sistema operacional e o ambiente de execução. No caso do WebAssembly, ele pode não ser facilmente acessível ou utilizável por aplicativos. Além disso, os sistemas virtuais modernos têm limites máximos 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 que eles ofereçam a melhor performance aos usuários. No entanto, se eles usarem muita memória, poderão ser penalizados pela plataforma de execução ou ficar sem memória, resultando em falhas.

Como nota histórica, o problema original que o Photoshop precisava resolver era editar arquivos de resolução de impressão em versões anteriores do macOS, com apenas 1 MB para o SO e todos os aplicativos. Uma imagem de página inteira de 300 dpi em CMYK tem aproximadamente 32 MB descompactados.

A solução

Para resolver o problema do app que excede a quantidade disponível de RAM, o Photoshop implementou um sistema de memória virtual de software (VM). O Photoshop usa a VM para gerenciar dados de documentos, principalmente dados de imagens, todo o histórico de anulação e o estado, além do armazenamento de trabalho para o comando atual. Ele também é usado para armazenar em cache grandes blocos de dados, como descrições de pincéis, para que eles precisem ser serializados do disco apenas 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 piramidal de blocos, fornecendo dados de imagem em uma faixa de resoluções baixas a altas. Isso permite que o Photoshop opere com os dados de resolução adequados para uma resposta mais rápida ao aplicar zoom ou visualizar uma prévia, em vez de aplicar zoom out.

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

Durante a inicialização do aplicativo, o Photoshop determina quanta RAM está disponível. Ele reserva uma parte para os dados serem armazenados na VM. A RAM restante fica disponível para outras necessidades de aplicativos pela biblioteca de execução C++ padrão. A memória da VM é dividida em páginas. Cada página é normalmente 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 de geometria. Um bloco consome uma ou mais páginas.

O Photoshop cria um ou mais arquivos temporários para fornecer suporte baseado em disco para páginas de VM. Esses arquivos são armazenados no sistema de arquivos particular de origem. A captura de tela mostra uma hierarquia de arquivos exemplar de um arquivo temporário (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 suporte, ela cria outros arquivos temporários. À medida que as páginas são liberadas, o espaço delas em um arquivo de rascunho pode ser reutilizado para novas páginas.

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

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 de destino da iteração atual estejam na memória, carregando-os de arquivos em branco conforme necessário. Ao mesmo tempo, ele pode limpar páginas para os arquivos de rascunho para criar espaço na memória.

Conclusões

Embora os detalhes concretos da implementação da VM vão muito além do escopo deste documento (e também são propriedade da Adobe), com a descrição de alto nível da solução, você pode entender como o Photoshop lida com arquivos grandes. O sistema de arquivos particular de origem, com acesso de leitura e gravação de arquivos de alto desempenho, é um componente-chave da solução.

Agradecimentos

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