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

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

Nabeel Al-Shamma
Nabeel Al-Shamma

Introducción

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

En 2021, Adobe, junto con la ingeniería de Chrome, llevó una versión de Photoshop a la Web. El software hace un uso innovador de WebAssembly con funciones como SIMD, almacenamiento de alto rendimiento en el sistema de archivos privados de origen, el espacio de color P3 para el lienzo y componentes web con Lit. En este artículo, queremos enfocarnos en cómo la ingeniería de Adobe Photoshop resolvió el trabajo con archivos más grandes de lo 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 editas 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 a menudo requieren 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 digital para los que se utiliza, y las capacidades de los dispositivos del usuario.

El formato de archivo de Photoshop almacena datos con una compresión sin pérdidas. Cuando se lee un archivo o documento, todos los datos de la imagen se descomprimen 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 usa un documento en el disco o en el almacenamiento en la nube.

Photoshop admite un historial de Deshacer de gran tamaño. Muchas operaciones en Photoshop son lo que llamamos operaciones destructivas. Es decir, realizar una edición, como pintar con un pincel, generará datos de píxeles nuevos que pueden ser tan grandes como los datos de píxeles originales. Cuando se realizan estas ediciones en una sesión de edición larga, se obtienen grandes cantidades de datos de píxeles que se deben conservar para poder realizar operaciones de deshacer. Por lo tanto, el historial puede alcanzar varios cientos de megabytes o muchos gigabytes de datos.

Los dispositivos y las plataformas, ya sean máquinas 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 memoria de acceso aleatorio (RAM) deseada. 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 o no puedan usarlas. Además, los sistemas virtuales modernos tienen límites superiores que los requisitos de Photoshop superan con facilidad.

Idealmente, las aplicaciones usarían tanta memoria como necesitan. Por lo general, esto les permite proporcionar el mejor rendimiento a sus usuarios. Sin embargo, si usan demasiada memoria, es posible que sean penalizados por la plataforma de tiempo de ejecución o que se queden sin memoria, lo que provocará fallas.

A modo de recordatorio, el problema original que necesitaba resolver Photoshop era la edición de los archivos de resolución de impresión en las primeras versiones de macOS, de tan solo 1 MB para el SO y todas las aplicaciones. Una imagen de página completa de 300 dpi en formato CMYK tiene un tamaño aproximado de 32 MB sin comprimir.

La solución

Para solucionar el problema de que la aplicación exceda la cantidad de RAM disponible, Photoshop implementó un sistema de memoria virtual (VM) de software. Photoshop usa su VM para administrar los datos de documentos, especialmente los datos de imágenes, todo el historial y el estado de deshacer, además del almacenamiento de trabajo para el 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 imágenes se almacenan mediante una representación mipmap, que es un conjunto piramidal de mosaicos que proporciona datos de imágenes en un rango de resoluciones bajas a altas. Esto permite que Photoshop opere en los datos de resolución adecuados para obtener respuestas más rápidas cuando se acerca o mira una vista previa, en lugar de alejarse.

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

Durante la inicialización de la aplicación, Photoshop determina cuánta RAM hay 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 en tiempo de ejecución C++ estándar. La memoria de la VM se divide en páginas. Cada página suele ser un múltiplo del tamaño de la página de hardware del dispositivo. Cuando se usa para datos de imágenes, se hace referencia a la memoria como mosaicos. Un mosaico es un área cuadrada de píxeles de una única capa, incluidos los límites geométricos. Una tarjeta consume una o más páginas.

Photoshop crea uno o más archivos reutilizables para proporcionar copias de seguridad basadas en discos de las páginas de VM. Estos archivos reutilizables se almacenan en el sistema de archivos privados de origen. En la captura de pantalla, se muestra una jerarquía de archivos ejemplar de este tipo de archivo temporal (resaltado en amarillo) y otros archivos durante una sesión de edición de imágenes. Cada archivo temporal puede contener muchas páginas de VM. Cuando la VM necesita más copia de seguridad, crea archivos reutilizables adicionales. A medida que se liberan páginas, su espacio en un archivo temporal se puede volver a usar para páginas nuevas.

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

Al procesar datos de imágenes, Photoshop itera en mosaicos y realiza cálculos de píxeles. Cada cálculo puede hacer referencia a varios mosaicos. La VM se encarga de garantizar que los mosaicos de origen y destino de la iteración actual estén en la memoria, y los carga desde archivos reutilizables según sea necesario. Al mismo tiempo, puede vaciar las páginas en los archivos reutilizables para hacer espacio en la memoria.

Conclusiones

Si bien los detalles concretos de la implementación de la VM irían 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 pusimos en una posición en la que puedes comprender cómo Photoshop puede lidiar con archivos grandes. El sistema de archivos privados 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. Queremos dar un agradecimiento especial a Russell Williams por su excelente documentación sobre la VM de Photoshop.