Descubre cómo Adobe permitió que los usuarios editaran incluso los archivos más grandes de 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 la ingeniería de Chrome, trajeron 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 lienzos 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 que los que caben 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.
El problema
Abrir un archivo para editarlo requiere una gran cantidad de memoria, significativamente 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 numerosas funciones que ofrece el software, los tipos de diseño digital y edición para los que se utiliza, 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 que el procesamiento sea 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 muy grande de deshacer. Muchas operaciones en Photoshop son lo que llamamos operaciones destructivas. Es decir, si realizas una edición como pintar con un pincel, obtendrás nuevos datos de píxeles que pueden ser tan grandes como los datos de píxeles originales. Si realizas estas ediciones en una sesión de edición prolongada, obtendrás grandes cantidades de datos de píxeles que se deben conservar para poder deshacer las operaciones. Por lo tanto, el historial puede llegar a 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 cuanto a 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) deseada. Muchas de estas plataformas también admiten memoria virtual, lo que permite que una aplicación utilice 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, y es posible que las aplicaciones no puedan acceder a ella ni usarla. Además de eso, los sistemas virtuales modernos tienen límites superiores que los requisitos de Photoshop superan fácilmente.
Lo ideal sería que las aplicaciones usaran toda la memoria que necesiten. Por lo general, esto les permite proporcionar el mejor rendimiento a sus usuarios. Sin embargo, si usan demasiada memoria, es posible que la plataforma del entorno de ejecución los penalice o que se quede sin memoria, lo que provocará fallas.
Como nota histórica, el problema original que Photoshop necesitaba resolver era editar 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 aproximadamente 32 MB sin comprimir.
La solución
Para solucionar el problema en el que la app superaba la cantidad de RAM disponible, Photoshop implementó un sistema de memoria virtual (VM) de software. Photoshop usa su VM para administrar datos de documentos, especialmente datos de imágenes, todo el historial y el estado de deshacer, así como el almacenamiento de trabajo para el comando actual. También se usa para almacenar en caché grandes bloques de datos, como las descripciones de pincel, de modo que solo sea necesario serializarlos desde el disco una vez.
Como ejemplo de uno de los aspectos que administra la VM, los datos de imagen se almacenan usando una representación mipmap, que es un conjunto piramidal de mosaicos, y proporciona datos de imagen en un rango de resoluciones bajas a altas. Esto permite que Photoshop opere en los datos de resolución apropiada para brindar una respuesta más rápida al acercar la imagen o al mirar una vista previa, en lugar de usar una imagen alejada.
Durante la inicialización de la aplicación, Photoshop determina cuánta RAM está disponible. Se reserva una parte para que los datos se almacenen en la VM. La RAM restante está disponible para otras necesidades de la aplicación mediante la biblioteca de 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, la memoria se denomina tarjetas. Un mosaico es un área cuadrada de píxeles de una sola capa, que incluye los límites geométricos. Una tarjeta consume una o más páginas.
Photoshop crea uno o más archivos reutilizables para brindar copias de seguridad en disco para 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 de ejemplo de un archivo temporal de este tipo (destacado 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 copias de seguridad, crea archivos reutilizables adicionales. A medida que se liberan páginas, el espacio en un archivo temporal se puede volver a usar en páginas nuevas.
Al procesar datos de imágenes, Photoshop itera sobre los mosaicos y realiza cálculos de píxeles. Cada cálculo puede hacer referencia a múltiples mosaicos. La VM es responsable de garantizar que los mosaicos de origen y destino de la iteración actual estén en la memoria, y de cargarlos desde los archivos nuevos según sea necesario. Al mismo tiempo, puede vaciar páginas en los archivos reutilizables para liberar espacio en la memoria.
Conclusiones
Si bien los detalles concretos de la implementación de la VM irían 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 hemos puesto en una posición en la que puedes comprender cómo Photoshop puede manejar 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. Un agradecimiento especial a Russell Williams por su excelente documentación sobre la VM de Photoshop.