Scopri come Adobe è riuscita a consentire agli utenti di modificare anche i file più grandi sulla 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 di colore P3 per la tela e componenti web con Lit. In questo articolo, vogliamo concentrarci su come il team di ingegneri di Adobe Photoshop ha risolto il problema della gestione di file più grandi di quelli che possono essere memorizzati in memoria. Nel caso di WebAssembly, come funziona Photoshop con i file più grandi dello spazio degli indirizzi a 32 bit di wasm32.
Il problema
L'apertura di un file per la modifica richiede una grande quantità di memoria, molto più di quanto ne richieda l'apertura di un file per la visualizzazione. I file modificati in Photoshop richiedono spesso più memoria di quella disponibile sul dispositivo dell'utente, a causa delle numerose funzionalità offerte dal software, dei tipi di design e modifica digitali per cui viene utilizzato e delle funzionalità dei dispositivi dell'utente.
Il formato file di Photoshop memorizza i dati con compressione senza perdita di dati. Quando viene letto un file o un documento, tutti i dati delle immagini vengono decompressi per consentire un'elaborazione più efficiente. Di conseguenza, la quantità di memoria richiesta può essere molte volte superiore allo spazio utilizzato da un documento su disco o nello spazio di archiviazione sul cloud.
Photoshop supporta una cronologia di annullamenti molto ampia. Molte operazioni in Photoshop sono quelle che chiamiamo operazioni distruttive. In altre parole, apportare una modifica come dipingere con un pennello comporterà la creazione di nuovi dati dei pixel che possono essere grandi quanto quelli originali. Se apporti queste modifiche in una sessione di modifica lunga, vengono generate grandi quantità di dati dei pixel che devono essere conservati per supportare le operazioni di annullamento. Di conseguenza, la cronologia può raggiungere 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. Alcuni sono più generosi di altri in termini di memoria a disposizione delle applicazioni. La quantità di memoria varia anche da dispositivo a dispositivo, come sai quando ordini un nuovo computer o dispositivo e specifichi la quantità di Random-Access Memory (RAM) desiderata. Molte di queste piattaforme supportano anche la memoria virtuale, che consente a un'applicazione di utilizzare più memoria di quella fisicamente disponibile. Questo supporto varia in base al sistema operativo e al runtime, come nel caso di WebAssembly, potrebbe non essere facilmente accessibile o utilizzabile dalle applicazioni. Inoltre, i sistemi virtuali moderni hanno limiti superiori che vengono facilmente superati dai requisiti di Photoshop.
Idealmente, le applicazioni utilizzerebbero la memoria necessaria. In genere, questo consente di offrire il miglior rendimento agli utenti. Tuttavia, se utilizzano troppa memoria, potrebbero essere penalizzati dalla piattaforma di runtime o esaurire la memoria, con conseguenti errori.
Come nota storica, il problema originale che Photoshop doveva risolvere era la modifica dei file di risoluzione di stampa sulle prime versioni di macOS, con dimensioni minime di 1 MB per il sistema operativo e tutte le applicazioni. Un'immagine a pagina intera a 300 dpi in CMYK occupa circa 32 MB non compressi.
Soluzione
Per risolvere il problema dell'app che supera la quantità di RAM disponibile, Photoshop ha implementato un sistema di memoria virtuale (VM) software. Photoshop utilizza la propria VM per gestire i dati dei documenti, in particolare i dati delle immagini, l'intera cronologia di annullamento e lo stato, nonché lo spazio di lavoro per il comando corrente. Viene utilizzato anche per memorizzare nella cache 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 delle immagini vengono archiviati utilizzando una rappresentazione mipmap, ovvero un insieme piramidale di riquadri, che fornisce dati delle immagini in una gamma di risoluzioni da basse ad alte. In questo modo, Photoshop può utilizzare i dati di risoluzione appropriati per una risposta più rapida quando aumenti lo zoom o visualizzi un'anteprima rispetto a quando diminuisci lo zoom.
Durante l'inizializzazione dell'applicazione, Photoshop determina la quantità di RAM disponibile. Mette da parte una parte per i dati da archiviare 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. In genere, ogni pagina è un multiplo delle dimensioni della pagina hardware del dispositivo. Quando viene utilizzata per i dati delle immagini, la memoria viene indicata come riquadri. Un riquadro è un'area quadrata di pixel di un singolo livello, inclusi i limiti della geometria. Un riquadro occupa una o più pagine.
Photoshop crea uno o più file di scratch per fornire il supporto su disco per le pagine VM. Questi file di scratch vengono archiviati nel file system privato di origine. Lo screenshot mostra una gerarchia di file di esempio di un file scratch (evidenziato in giallo) e di altri file durante una sessione di modifica delle immagini. Ogni file scratch può contenere molte pagine VM. Quando la VM ha bisogno di più supporto, crea file di scratch aggiuntivi. Quando le pagine vengono liberate, lo spazio in un file scratch può essere riutilizzato per nuove pagine.
Durante l'elaborazione dei dati delle immagini, Photoshop esegue l'iterazione sui riquadri, effettuando calcoli sui 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 corrente siano in memoria, caricandoli dai file da zero, se necessario. Allo stesso tempo, può svuotare le pagine nei file di scratch per fare spazio in memoria.
Conclusioni
Sebbene i dettagli concreti dell'implementazione della VM esulano dall'ambito di questo documento (e sono inoltre di proprietà di Adobe), con la descrizione di alto livello della soluzione ti abbiamo messo in condizione di capire come Photoshop può gestire i file di grandi dimensioni. Il file system privato di origine, con il suo accesso in lettura e scrittura ad alte prestazioni ai file, è un componente chiave della soluzione.
Ringraziamenti
Questo post del blog è stato esaminato da Oliver Unter Ecker e Rachel Andrew. Un ringraziamento speciale a Russell Williams per la sua eccellente documentazione sulla VM Photoshop.