Ontdek hoe Adobe het voor elkaar heeft gekregen om gebruikers zelfs de grootste bestanden te laten bewerken in de webversie van zijn iconische Photoshop-app.
Invoering
(Dit artikel is ook beschikbaar als video.)
In 2021 bracht Adobe, samen met Chrome Engineering, een versie van Photoshop naar het web . De software maakt innovatief gebruik van WebAssembly met functies zoals SIMD , high-performance opslag in het oorspronkelijke private file system , de P3-kleurruimte voor canvas en Web Components with Lit. In dit artikel willen we ons richten op hoe Adobe Photoshop Engineering oplossingen heeft gevonden voor het werken met bestanden 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.

Het probleem
Het openen van een bestand om te bewerken vereist veel geheugen, aanzienlijk meer dan het openen van een bestand om 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 van de software, de soorten digitaal ontwerp en bewerking waarvoor het wordt gebruikt, en de mogelijkheden van de apparaten van de gebruiker.
Het Photoshop-bestandsformaat slaat gegevens op met verliesvrije compressie. Wanneer een bestand of document wordt gelezen, worden alle afbeeldingsgegevens gedecomprimeerd voor een efficiëntere verwerking. Hierdoor kan de benodigde hoeveelheid geheugen vele malen groter zijn dan de hoeveelheid ruimte die een document inneemt op schijf of in de cloud.
Photoshop ondersteunt een zeer grote ongedaanmakingsgeschiedenis. Veel bewerkingen in Photoshop zijn wat we destructieve bewerkingen noemen. Dat wil zeggen dat een bewerking, zoals schilderen met een penseel, resulteert in nieuwe pixelgegevens die net zo groot kunnen zijn als de oorspronkelijke pixelgegevens. Het uitvoeren van deze bewerkingen tijdens een lange bewerkingssessie levert grote hoeveelheden pixelgegevens op die bewaard moeten worden om ongedaanmakingsbewerkingen te kunnen ondersteunen. De geschiedenis kan dus oplopen tot enkele honderden megabytes of zelfs vele gigabytes aan gegevens.
Apparaten en platforms, of het nu desktopcomputers, mobiele apparaten of browsers zijn, beheren allemaal geheugen. Sommige zijn genereuzer dan andere in de hoeveelheid geheugen die ze beschikbaar stellen voor applicaties. De hoeveelheid geheugen varieert ook per apparaat, zoals u weet wanneer u een nieuwe computer of apparaat bestelt en de gewenste hoeveelheid Random-Access Memory (RAM) specificeert. 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, mogelijk niet direct toegankelijk of bruikbaar is voor applicaties. Bovendien hebben moderne virtuele systemen bovengrenzen die gemakkelijk worden overschreden door de vereisten van Photoshop.
Idealiter zouden applicaties zoveel geheugen gebruiken als nodig is. Dit stelt hen in staat om hun gebruikers optimale prestaties te bieden. Als ze echter te veel geheugen gebruiken, kunnen ze worden afgestraft door het runtime-platform of kan het geheugen vol raken, wat tot fouten kan leiden.
Historisch gezien was het oorspronkelijke probleem dat Photoshop moest oplossen het bewerken van bestanden met een afdrukresolutie in vroege versies van macOS, met een bestandsgrootte van slechts 1 MB voor het besturingssysteem en alle applicaties. Een 300 dpi paginavullende afbeelding in CMYK is ongeveer 32 MB ongecomprimeerd.
De oplossing
Om het probleem op te lossen dat de app de beschikbare hoeveelheid RAM overschreed, implementeerde Photoshop een softwarematig virtueel geheugensysteem (VM). Photoshop gebruikt dit VM om documentgegevens te beheren, met name afbeeldingsgegevens, de volledige ongedaanmakingsgeschiedenis en -status, en de werkopslag voor de huidige opdracht. Het wordt ook gebruikt voor het cachen van grote blokken gegevens, zoals penseelbeschrijvingen, zodat ze slechts één keer van de schijf hoeven te worden geserialiseerd.
Een voorbeeld van een aspect dat door de VM wordt beheerd, is dat beeldgegevens worden opgeslagen met behulp van een mipmap- representatie. Dit is een piramidale set tegels die beeldgegevens levert met een bereik van lage tot hoge resolutie. Hierdoor kan Photoshop met de juiste resolutiegegevens werken voor een snellere reactie bij inzoomen of het bekijken van een preview, in plaats van bij uitzoomen.

Tijdens de initialisatie van de applicatie bepaalt Photoshop hoeveel RAM er beschikbaar is. Eén deel wordt gereserveerd voor gegevens die in de virtuele machine (VM) worden opgeslagen. Het resterende RAM-geheugen is beschikbaar voor andere applicaties via de standaard C++ runtime-bibliotheek. Het geheugen van de virtuele machine (VM) is verdeeld in pagina's . Elke pagina is doorgaans een veelvoud van de hardwarepaginagrootte van het apparaat. Wanneer geheugen wordt gebruikt voor afbeeldingsgegevens, wordt het aangeduid als tegels. Een tegel is een vierkant gebied met pixels van een enkele laag, inclusief geometrische grenzen. Een tegel neemt één of meer pagina's in beslag.
Photoshop maakt een of meer scratch-bestanden aan om schijfgebaseerde back-up te bieden voor VM-pagina's. Deze scratch-bestanden worden opgeslagen in het oorspronkelijke privébestandssysteem (PPS ). De schermafbeelding toont een voorbeeld van een bestandshiërarchie van zo'n scratch-bestand (geel gemarkeerd) en andere bestanden tijdens een beeldbewerkingssessie. Elk scratch-bestand kan meerdere VM-pagina's bevatten. Wanneer de VM meer back-up nodig heeft, worden er extra scratch-bestanden aangemaakt. Naarmate pagina's vrijkomen, kan de ruimte in een scratch-bestand worden hergebruikt voor nieuwe pagina's.

Bij het verwerken van afbeeldingsgegevens itereert Photoshop over tegels en voert pixelberekeningen uit. Elke berekening kan naar meerdere tegels verwijzen. De virtuele machine is verantwoordelijk voor het ervoor zorgen dat de bron- en doeltegels voor de huidige iteratie in het geheugen staan en laadt ze indien nodig vanuit scratch-bestanden. Tegelijkertijd kan het pagina's naar de scratch-bestanden flushen om ruimte in het geheugen vrij te maken.
Conclusies
Hoewel de concrete implementatiedetails van de VM veel verder gaan dan de reikwijdte van dit document (en ook eigendom zijn van Adobe), hebben we u met de uitgebreide beschrijving van de oplossing in staat gesteld te begrijpen hoe Photoshop met grote bestanden omgaat. Het oorspronkelijke private bestandssysteem met zijn uiterst krachtige lees- en schrijftoegang tot bestanden is een belangrijk onderdeel van de oplossing.
Dankbetuigingen
Deze blogpost is beoordeeld door Oliver Unter Ecker en Rachel Andrew. Met speciale dank aan Russell Williams voor zijn uitstekende documentatie over de Photoshop VM.