In che modo Photoshop ha risolto l'operazione con file di dimensioni superiori a quelle in grado di memorizzare in memoria

Scopri come Adobe è riuscita a consentire agli utenti di modificare anche i file più grandi nella versione web della sua iconica app Photoshop.

Introduzione

Questo articolo è disponibile anche sotto forma di video.

Nel 2021, Adobe, insieme al team tecnico di Chrome, ha portato una versione di Photoshop sul web. Il software fa un uso innovativo di WebAssembly con funzionalità come SIMD, archiviazione ad alte prestazioni nel file system privato di origine, spazio colore P3 per il canvas e componenti web con Lit. In questo articolo vogliamo concentrarci su come l'ingegneria di Adobe Photoshop ha risolto il problema lavorando con file di dimensioni maggiori di quelle che possono essere in memoria. E, nel caso di WebAssembly, come Photoshop funziona con file più grandi dello spazio di indirizzi a 32 bit di wasm32.

L'app Photoshop durante la modifica di un'immagine del logo Project Fugu.

Il problema

L'apertura di un file per la modifica richiede una grande quantità di memoria, molto di più dell'apertura di un file per la visualizzazione. I file modificati in Photoshop spesso richiedono più memoria di quella disponibile sul dispositivo dell'utente, a causa delle numerose funzionalità offerte dal software, dei tipi di progettazione e editing digitale per cui viene utilizzato e delle funzionalità dei dispositivi dell'utente.

Il formato file di Photoshop archivia i dati con compressione senza perdita di dati. Quando un file o un documento viene letto, tutti i dati dell'immagine vengono decompressi per consentire un'elaborazione più efficiente. Di conseguenza, la quantità di memoria richiesta può essere diverse volte superiore a quella utilizzata da un documento su disco o nello spazio di archiviazione sul cloud.

Photoshop supporta una cronologia degli annullamenti di grandi dimensioni. Molte operazioni in Photoshop sono quelle che chiamiamo operazioni distruttive. In altre parole, una modifica, come la pittura con un pennello, genererà nuovi dati di pixel che possono essere grandi quanto quelli dei pixel originali. Apportare queste modifiche in una lunga sessione di editing produce grandi quantità di dati di pixel che devono essere conservati per supportare le operazioni di annullamento. In questo modo, la cronologia può crescere fino a diverse centinaia di megabyte o molti gigabyte di dati.

Dispositivi e piattaforme, che si tratti di computer, dispositivi mobili o browser, gestiscono tutti la memoria. Alcune sono più generose di altre nella quantità di memoria che rendono disponibile alle applicazioni. La quantità di memoria varia anche da un dispositivo all'altro, come sai quando ordini un nuovo computer o dispositivo e specifichi la quantità di memoria ad accesso casuale (RAM) desiderata. Molte di queste piattaforme supportano anche la memoria virtuale, che consente a un'applicazione di utilizzare più memoria di quella disponibile fisicamente. Questo supporto varia a seconda del sistema operativo e del runtime, come nel caso di WebAssembly, potrebbe non essere facilmente accessibile o utilizzabile dalle applicazioni. Inoltre, i sistemi virtuali moderni prevedono limiti massimi che possono essere facilmente superati dai requisiti di Photoshop.

Idealmente, le applicazioni dovrebbero utilizzare la memoria necessaria. In genere questo consente di offrire il miglior rendimento possibile agli utenti. Tuttavia, se utilizzano troppa memoria, potrebbero essere penalizzati dalla piattaforma di runtime o esaurire la memoria, causando errori.

Come nota storica, il problema originale che Photoshop doveva risolvere era la modifica dei file di risoluzione di stampa nelle prime versioni di macOS, a soli 1 MB per il sistema operativo e tutte le applicazioni. Un'immagine a pagina intera da 300 dpi in CMYK corrisponde a circa 32 MB non compressa.

Soluzione

Per risolvere il problema dell'app che superava la quantità di RAM disponibile, Photoshop ha implementato un sistema di memoria virtuale (VM) software. Photoshop utilizza la sua VM per gestire i dati dei documenti, in particolare i dati immagine, tutta la cronologia e lo stato degli annullamenti, nonché la memoria di lavoro per il comando corrente. Viene utilizzato anche per la memorizzazione nella cache di grandi blocchi di dati, come le descrizioni dei pennelli, in modo che debbano essere serializzati dal disco una sola volta.

Come esempio di uno degli aspetti gestiti dalla VM, i dati immagine vengono archiviati utilizzando una rappresentazione mipmap, che è un insieme piramidale di riquadri che fornisce dati immagine in un intervallo di risoluzioni da bassa ad alta. Ciò consente a Photoshop di operare sui dati di risoluzione appropriati per una risposta più rapida quando aumenti lo zoom o guardi un'anteprima, rispetto a quando lo zoom diminuisce.

Esempio di archiviazione di immagini mipmap: l'immagine principale a sinistra è accompagnata da copie filtrate di dimensioni ridotte.

Durante l'inizializzazione dell'applicazione, Photoshop determina la quantità di RAM disponibile. Mette da parte una parte per l'archiviazione dei dati nella VM. La RAM rimanente è disponibile per altre esigenze dell'applicazione tramite la libreria di runtime C++ standard. La memoria della VM è suddivisa in pagine. Ogni pagina è in genere un multiplo delle dimensioni della pagina hardware per il dispositivo. Quando viene utilizzata per i dati delle immagini, la memoria è indicata come riquadri. Un riquadro è un'area quadrata di pixel di un singolo livello, inclusi i limiti geometrici. Un riquadro occupa una o più pagine.

Photoshop crea uno o più file temporanei per fornire un supporto basato su disco per le pagine delle VM. Questi file temporanei vengono archiviati nel file system privato dell'origine. Lo screenshot mostra una gerarchia di file di esempio di questo file temporaneo (evidenziato in giallo) e di altri file durante una sessione di modifica di immagini. Ogni file temporaneo può contenere molte pagine VM. Quando la VM ha bisogno di un maggiore supporto, crea altri file scratchpad. Man mano che le pagine vengono liberate, il loro spazio in un file temporaneo può essere riutilizzato per nuove pagine.

Ispezione della gerarchia dei file system privati di origine di Photoshop con l'estensione di Chrome Explorer OPFS.

Durante l'elaborazione dei dati delle immagini, Photoshop esegue l'iterazione sui riquadri, eseguendo i calcoli dei pixel. Ogni calcolo può fare riferimento a più riquadri. La VM è responsabile di garantire che i riquadri di origine e di destinazione per l'iterazione attuale siano in memoria, caricandoli da file scratchpad come richiesto. Allo stesso tempo, può eseguire il flush delle pagine nei file scratchpad per liberare spazio nella memoria.

Conclusioni

Anche se i dettagli concreti dell'implementazione della VM andrebbero ben oltre l'ambito di questo documento (e sono di proprietà di Adobe), con una descrizione generale della soluzione, ti abbiamo messo in una posizione in cui puoi capire come Photoshop può gestire file di grandi dimensioni. Il file system privato di origine, con le elevate prestazioni dell'accesso in lettura e scrittura ai file, è un componente fondamentale della soluzione.

Ringraziamenti

Questo post del blog è stato esaminato da Oliver Unter Ecker e Rachel Andrew. Un ringraziamento speciale a Russell Williams per l'eccellente documentazione sulle foto di Photoshop.