Cómo hizo Photoshop el trabajo con archivos más grandes de lo que puede caber en la memoria

Descubre cómo Adobe logró permitir que los usuarios editen incluso los archivos más grandes en la versión web de su icónica app de Photoshop.

Introducción

(Este artículo también está disponible en forma de video).

En 2021, Adobe, junto con el equipo de Ingeniería de Chrome, lanzó una versión de Photoshop para la Web. El software usa WebAssembly de forma innovadora con funciones como SIMD, almacenamiento de alto rendimiento en el sistema de archivos privado de origen, el espacio de color P3 para el lienzo y los componentes web con Lit. En este artículo, queremos enfocarnos en cómo el equipo de ingeniería de Adobe Photoshop resolvió el problema de trabajar con archivos más grandes que los que pueden caber en la memoria. Y, en el caso de WebAssembly, cómo funciona Photoshop con archivos más grandes que el espacio de direcciones de 32 bits de wasm32.

La app de Photoshop mientras se edita una imagen del logotipo de Project Fugu.

El problema

Abrir un archivo para editarlo requiere una gran cantidad de memoria, mucho más que abrir un archivo para verlo. Los archivos editados en Photoshop suelen requerir más memoria de la que un usuario tiene disponible en su dispositivo, debido a las muchas funciones que ofrece el software, los tipos de diseño y edición digitales para los que se usa, y las capacidades de los dispositivos de los usuarios.

El formato de archivo de Photoshop almacena datos con compresión sin pérdidas. Cuando se lee un archivo o documento, se descomprimen todos los datos de la imagen para permitir un procesamiento más eficiente. Como resultado, la cantidad de memoria requerida puede ser varias veces mayor que la cantidad de espacio que ocupa un documento en el disco o en el almacenamiento en la nube.

Photoshop admite un historial de deshacer muy grande. Muchas operaciones en Photoshop son lo que llamamos operaciones destructivas. Es decir, si realizas una edición, como pintar con un pincel, se generarán datos de píxeles nuevos que pueden ser tan grandes como los datos de píxeles originales. Hacer estas ediciones en una sesión de edición larga genera grandes cantidades de datos de píxeles que se deben conservar para admitir operaciones de deshacer. Por lo tanto, el historial puede crecer hasta varios cientos de megabytes o muchos gigabytes de datos.

Los dispositivos y las plataformas, ya sean computadoras de escritorio, dispositivos móviles o navegadores, administran la memoria. Algunos son más generosos que otros en la cantidad de memoria que ponen a disposición de las aplicaciones. La cantidad de memoria también varía de un dispositivo a otro, como sabes cuando pides una computadora o un dispositivo nuevos y especificas la cantidad de memoria de acceso aleatorio (RAM) que deseas. Muchas de estas plataformas también admiten memoria virtual, lo que permite que una aplicación use más memoria de la que está disponible físicamente. Esta compatibilidad varía según el sistema operativo y el entorno de ejecución, como en el caso de WebAssembly, por lo que es posible que las aplicaciones no puedan acceder a ella ni usarla fácilmente. Además, los sistemas virtuales modernos tienen límites superiores que superan fácilmente los requisitos de Photoshop.

Idealmente, las aplicaciones usarían tanta memoria como necesiten. Por lo general, esto les permite proporcionar el mejor rendimiento a sus usuarios. Sin embargo, si usan demasiada memoria, la plataforma de tiempo de ejecución puede penalizarlos o pueden quedarse sin memoria, lo que genera fallas.

Como nota histórica, el problema original que Photoshop debía resolver era editar archivos de resolución de impresión en versiones anteriores de macOS, de tan solo 1 MB para el SO y todas las aplicaciones. Una imagen de página completa de 300 ppp en CMYK ocupa aproximadamente 32 MB sin comprimir.

La solución

Para resolver el problema de que la app supere la cantidad disponible de RAM, Photoshop implementó un sistema de memoria virtual (VM) de software. Photoshop usa su VM para administrar los datos de documentos, en especial los datos de imágenes, todo el historial y el estado de deshacer, así como el almacenamiento en uso del comando actual. También se usa para almacenar en caché grandes bloques de datos, como descripciones de pinceles, de modo que solo se deban serializar desde el disco una vez.

Como ejemplo de uno de los aspectos que administra la VM, los datos de imagen se almacenan con una representación de mipmap, que es un conjunto piramidal de tarjetas que proporciona datos de imagen en un rango de resoluciones bajas a altas. Esto permite que Photoshop opere con los datos de resolución adecuados para obtener una respuesta más rápida cuando se acerca o se ve una vista previa, en comparación con una vista más alejada.

Ejemplo de almacenamiento de imágenes de mipmap: la imagen principal de la izquierda se acompaña de copias filtradas de tamaño reducido.

Durante la inicialización de la aplicación, Photoshop determina cuánta RAM está disponible. Reserva una parte para que los datos se almacenen en la VM. La RAM restante está disponible para otras necesidades de la aplicación a través de la biblioteca estándar del entorno de ejecución de C++. La memoria de la VM se divide en páginas. Por lo general, cada página es un múltiplo del tamaño de página de hardware del dispositivo. Cuando se usa para datos de imágenes, se hace referencia a la memoria como tarjetas. Una tarjeta es un área cuadrada de píxeles de una sola capa, incluidos los límites de geometría. Una tarjeta consume una o más páginas.

Photoshop crea uno o más archivos de almacenamiento en caché para proporcionar una copia de seguridad basada en disco para las páginas de la VM. Estos archivos en blanco se almacenan en el sistema de archivos privados de origen. En la captura de pantalla, se muestra una jerarquía de archivos ejemplar de un archivo de borrador (destacado en amarillo) y otros archivos durante una sesión de edición de imágenes. Cada archivo de borrador puede contener muchas páginas de VM. Cuando la VM necesita más respaldo, crea archivos de almacenamiento en caché adicionales. A medida que se liberan las páginas, su espacio en un archivo de almacenamiento en búfer se puede reutilizar para páginas nuevas.

Inspección de la jerarquía de archivos del sistema de archivos privados de origen de Photoshop con la extensión de Chrome OPFS Explorer

Cuando se procesan los datos de imagen, Photoshop itera sobre las tarjetas y realiza cálculos de píxeles. Cada cálculo puede hacer referencia a varias tarjetas. La VM es responsable de garantizar que las tarjetas de origen y destino de la iteración actual estén en la memoria y las cargue desde archivos en blanco según sea necesario. Al mismo tiempo, puede borrar páginas en los archivos de borrador para liberar espacio en la memoria.

Conclusiones

Si bien los detalles concretos de la implementación de la VM van mucho más allá del alcance de este documento (y también son propiedad de Adobe), con la descripción de alto nivel de la solución, te brindamos la información necesaria para que comprendas cómo Photoshop puede manejar archivos grandes. El sistema de archivos privado de origen, con su acceso de lectura y escritura de alto rendimiento a los archivos, es un componente clave de la solución.

Agradecimientos

Oliver Unter Ecker y Rachel Andrew revisaron esta entrada de blog. Agradecemos especialmente a Russell Williams por su excelente documentación sobre la VM de Photoshop.