Hoe Photoshop het werken met bestanden oploste die groter waren dan in het geheugen passen

Ontdek hoe Adobe erin slaagde gebruikers zelfs de grootste bestanden te laten bewerken in de webversie van de iconische Photoshop-app.

Invoering

(Dit artikel is ook beschikbaar in de vorm van een video.)

In 2021 bracht Adobe samen met Chrome Engineering een versie van Photoshop op internet . De software maakt innovatief gebruik van WebAssembly met functies zoals SIMD , krachtige opslag in het oorspronkelijke privébestandssysteem , de P3-kleurruimte voor canvas en webcomponenten met Lit. In dit artikel willen we ons concentreren op de manier waarop de techniek van Adobe Photoshop het werken met bestanden heeft opgelost die groter zijn dan in het geheugen passen. En, in het geval van WebAssembly, hoe Photoshop werkt met bestanden die groter zijn dan de 32-bits adresruimte van wasm32.

De Photoshop-app tijdens het bewerken van een afbeelding van het Project Fugu-logo.

Het probleem

Het openen van een bestand om het te bewerken vereist een grote hoeveelheid geheugen, aanzienlijk meer dan het openen van een bestand om het te bekijken. De bestanden die in Photoshop worden bewerkt, vereisen vaak meer geheugen dan een gebruiker op zijn apparaat beschikbaar heeft, vanwege de vele functies die de software biedt, de soorten digitaal ontwerp en bewerking waarvoor deze wordt gebruikt en de mogelijkheden van gebruikersapparaten.

Het Photoshop-bestandsformaat slaat gegevens op met verliesvrije compressie. Wanneer een bestand of document wordt gelezen, worden alle afbeeldingsgegevens gedecomprimeerd om een ​​efficiëntere verwerking mogelijk te maken. Als gevolg hiervan kan de benodigde hoeveelheid geheugen meerdere malen groter zijn dan de hoeveelheid ruimte die een document in beslag neemt op schijf of in cloudopslag.

Photoshop ondersteunt een zeer grote geschiedenis van ongedaan maken. Veel bewerkingen in Photoshop zijn zogenaamde destructieve bewerkingen. Dat wil zeggen dat het uitvoeren van een bewerking, zoals schilderen met een penseel, zal resulteren in nieuwe pixelgegevens die net zo groot kunnen zijn als de originele pixelgegevens. Het uitvoeren van deze bewerkingen tijdens een lange bewerkingssessie levert grote hoeveelheden pixelgegevens op die moeten worden bewaard om bewerkingen voor ongedaan maken te ondersteunen. Zo kan de geschiedenis uitgroeien tot enkele honderden megabytes of vele gigabytes aan gegevens.

Apparaten en platforms, of het nu desktopmachines, mobiele apparaten of browsers zijn, beheren allemaal het geheugen. Sommige zijn genereuzer dan andere in de hoeveelheid geheugen die ze beschikbaar stellen voor applicaties. De hoeveelheid geheugen varieert ook van apparaat tot apparaat, zoals u weet wanneer u een nieuwe computer of apparaat bestelt en de gewenste hoeveelheid Random-Access Memory (RAM) opgeeft. Veel van deze platforms ondersteunen ook virtueel geheugen , waardoor een applicatie meer geheugen kan gebruiken dan fysiek beschikbaar is. Deze ondersteuning varieert per besturingssysteem en runtime, zoals in het geval van WebAssembly, en is mogelijk niet direct toegankelijk of bruikbaar voor applicaties. Bovendien hebben moderne virtuele systemen bovengrenzen die gemakkelijk worden overschreden door de vereisten van Photoshop.

Idealiter zouden applicaties zoveel geheugen gebruiken als ze nodig hebben. Hierdoor kunnen ze over het algemeen de beste prestaties aan hun gebruikers leveren. Als ze echter te veel geheugen gebruiken, kunnen ze worden bestraft door het runtimeplatform of kunnen ze onvoldoende geheugen hebben, wat tot storingen kan leiden.

Historisch gezien was het oorspronkelijke probleem dat Photoshop moest oplossen het bewerken van afdrukresolutiebestanden op eerdere versies van macOS, zo laag als 1 MB voor het besturingssysteem en alle applicaties. Een paginagrote afbeelding van 300 dpi in CMYK is ongeveer 32 MB ongecomprimeerd.

De oplossing

Om het probleem op te lossen waarbij de app de beschikbare hoeveelheid RAM overschrijdt, heeft Photoshop een softwarematig virtueel geheugensysteem (VM) geïmplementeerd. Photoshop gebruikt zijn VM om documentgegevens te beheren, vooral afbeeldingsgegevens, de hele geschiedenis en status van het ongedaan maken, evenals de werkopslag voor de huidige opdracht. Het wordt ook gebruikt voor het cachen van grote gegevensblokken, zoals penseelbeschrijvingen, zodat ze slechts één keer vanaf schijf hoeven te worden geserialiseerd.

Als voorbeeld van een van de aspecten die door de VM worden beheerd: beeldgegevens worden opgeslagen met behulp van een mipmap- representatie, een piramidevormige reeks tegels die beeldgegevens levert met een bereik van lage tot hoge resoluties. Hierdoor kan Photoshop werken met de juiste resolutiegegevens voor een snellere reactie bij inzoomen of bij het bekijken van een voorbeeld, in plaats van bij uitzoomen.

Voorbeeld opslag van mipmap-afbeeldingen: de hoofdafbeelding aan de linkerkant gaat vergezeld van gefilterde kopieën van verkleind formaat.

Tijdens de initialisatie van de applicatie bepaalt Photoshop hoeveel RAM beschikbaar is. Er wordt een deel gereserveerd voor gegevens die in de VM moeten worden opgeslagen. Het resterende RAM-geheugen is beschikbaar voor andere applicatiebehoeften via de standaard C++ runtime-bibliotheek. Het VM-geheugen is opgedeeld in pagina's . Elke pagina is doorgaans een veelvoud van de hardwarepaginagrootte voor het apparaat. Bij gebruik voor afbeeldingsgegevens wordt naar het geheugen verwezen als tegels. Een tegel is een vierkant gebied met pixels van een enkele laag, inclusief geometrische grenzen. Een tegel neemt een of meer pagina's in beslag.

Photoshop maakt een of meer werkbestanden om schijfgebaseerde back-up te bieden voor VM-pagina's. Deze werkbestanden worden opgeslagen in het oorspronkelijke privébestandssysteem . De schermafbeelding toont een voorbeeldige bestandshiërarchie van een dergelijk werkbestand (geel gemarkeerd) en andere bestanden tijdens een beeldbewerkingssessie. Elk werkbestand kan veel VM-pagina's bevatten. Wanneer de VM meer ondersteuning nodig heeft, worden er extra scratch-bestanden gemaakt. Wanneer pagina's vrijkomen, kan de ruimte in een scratch-bestand opnieuw worden gebruikt voor nieuwe pagina's.

Inspecteren van de oorspronkelijke bestandshiërarchie van het privébestandssysteem van Photoshop met de OPFS Explorer Chrome-extensie.

Bij het verwerken van afbeeldingsgegevens herhaalt Photoshop de tegels en voert pixelberekeningen uit. Elke berekening kan naar meerdere tegels verwijzen. De VM is ervoor verantwoordelijk dat de bron- en doeltegels voor de huidige iteratie zich in het geheugen bevinden, en laadt ze indien nodig helemaal opnieuw. Tegelijkertijd kan het pagina's naar de werkbestanden spoelen om ruimte in het geheugen vrij te maken.

Conclusies

Hoewel de concrete implementatiedetails van de VM veel verder zouden gaan dan het bestek van dit document (en ook eigendom zijn van Adobe), hebben we u met de beschrijving op hoog niveau van de oplossing in een positie gebracht waarin u kunt begrijpen hoe Photoshop omgaan met grote bestanden. Het originele privébestandssysteem met zijn zeer performante lees- en schrijftoegang tot bestanden is een belangrijk onderdeel van de oplossing.

Dankbetuigingen

Deze blogpost is beoordeeld door Oliver Unter Ecker en Rachel Andrew. Speciale dank aan Russell Williams voor zijn uitstekende documentatie over de Photoshop VM.