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

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

Nabeel al-Shamma
Nabeel al-Shamma

Introduzione

Questo articolo è disponibile anche sotto forma di video.

Nel 2021, Adobe, in collaborazione con gli ingegneri 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 dell'origine, lo spazio colore P3 per canvas e componenti web con Lit. In questo articolo, ci concentreremo su come i tecnici di Adobe Photoshop hanno risolto l'utilizzo di file di dimensioni superiori a quelle che possono rimanere in memoria. E, nel caso di WebAssembly, come funziona Photoshop con file più grandi dello spazio degli 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ù rispetto all'apertura di un file per la visualizzazione. I file modificati in Photoshop spesso richiedono più memoria di quella che un utente ha a disposizione sul proprio dispositivo, a causa delle numerose funzionalità offerte dal software, dei tipi di design e modifica digitale per cui vengono utilizzati e delle funzionalità dei dispositivi degli utenti.

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 molte volte superiore a quella utilizzata da un documento su disco o nello spazio di archiviazione sul cloud.

Photoshop supporta una cronologia di annullamento molto grande. Molte operazioni in Photoshop sono quelle che definiamo operazioni distruttive. Ciò significa che una modifica, ad esempio dipingendo con un pennello, genererà nuovi dati sui pixel che possono essere uguali a quelli originali. Apportare queste modifiche in una lunga sessione di modifica genera grandi quantità di dati sui pixel che devono essere conservati per supportare le operazioni di annullamento. In questo modo, la cronologia può arrivare fino a diverse centinaia di megabyte o molti gigabyte di dati.

I dispositivi e le piattaforme, che si tratti di computer, dispositivi mobili o browser, gestiscono tutti la memoria. Alcune sono più generose di altre per la quantità di memoria che mettono a disposizione delle applicazioni. La quantità di memoria varia anche da dispositivo a dispositivo, poiché 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 non utilizzabile dalle applicazioni. Inoltre, i sistemi virtuali moderni hanno limiti superiori che possono essere facilmente superati dai requisiti di Photoshop.

Idealmente, le applicazioni utilizzano tutta la memoria di cui hanno bisogno. In genere, questo consente loro di fornire il miglior rendimento possibile ai propri 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 con risoluzione di stampa sulle prime versioni di macOS, a partire da 1 MB per il sistema operativo e tutte le applicazioni. Un'immagine a pagina intera a 300 dpi in CMYK corrisponde a circa 32 MB non compressi.

Soluzione

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

Come esempio di uno degli aspetti gestiti dalla VM, i dati delle immagini vengono archiviati utilizzando una rappresentazione mipmap, ovvero un insieme di riquadri piramidali che fornisce dati delle immagini a una risoluzione compresa tra bassa e alta. Ciò consente a Photoshop di operare con i dati di risoluzione appropriati per una risposta più rapida quando si aumenta lo zoom o si guarda un'anteprima, invece che con lo zoom diminuito.

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 applicazioni tramite la libreria di runtime C++ standard. La memoria della VM è suddivisa in pagine. In genere, ogni pagina è un multiplo delle dimensioni delle pagine hardware del dispositivo. Quando utilizzata per dati immagine, la memoria viene indicata come riquadri. Un riquadro è un'area quadrata di pixel di un singolo livello che include i limiti geometrici. Un riquadro consuma una o più pagine.

Photoshop crea uno o più file temporanei per supportare le pagine VM tramite disco. Questi file temporanei sono archiviati nel file system privato dell'origine. Lo screenshot mostra una gerarchia esemplare di file di questo tipo (evidenziato in giallo) e altri file durante una sessione di modifica dell'immagine. Ogni file temporaneo può contenere molte pagine VM. Quando la VM ha bisogno di ulteriore supporto, crea file temporanei aggiuntivi. 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 OPFS Explorer.

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

Conclusioni

Mentre i dettagli concreti dell'implementazione della VM andrebbero ben oltre l'ambito di questo documento (e sono anche di proprietà di Adobe), con la descrizione generale della soluzione ti abbiamo messo in condizione di comprendere in che modo Photoshop può gestire file di grandi dimensioni. Il file system privato di origine, con il suo accesso in lettura e scrittura ai file ad alte prestazioni, è un componente chiave della soluzione.

Ringraziamenti

Questo post del blog è stato recensito da Oliver Unter Ecker e Rachel Andrew. Un ringraziamento speciale a Russell Williams per la sua eccellente documentazione sulla VM Photoshop.