Découvrez comment Adobe a réussi à permettre aux utilisateurs de modifier même les plus gros fichiers sur la version Web de son célèbre application Photoshop.
Introduction
(Cet article est également disponible sous forme de vidéo.)
En 2021, Adobe et les ingénieurs Chrome ont mis une version de Photoshop sur le Web. Le logiciel utilise WebAssembly de manière innovante grâce à des fonctionnalités telles que SIMD, le stockage hautes performances dans le système de fichiers privé d'origine, l'espace colorimétrique P3 pour le canevas et les composants Web avec Lit. Dans cet article, nous allons nous concentrer sur la façon dont les technologies d'Adobe Photoshop ont permis de résoudre le problème avec des fichiers plus volumineux que la capacité de mémoire. Dans le cas de WebAssembly, Photoshop fonctionne avec des fichiers d'une taille supérieure à l'espace d'adressage 32 bits de Wasm32.
Problème
L'ouverture d'un fichier pour modification nécessite une grande quantité de mémoire, bien plus que l'ouverture d'un fichier pour consultation. Les fichiers modifiés dans Photoshop nécessitent souvent plus de mémoire que ce dont l'utilisateur dispose sur son appareil, en raison des nombreuses fonctionnalités offertes par le logiciel, des types de conception et de retouche numériques pour lesquels il est utilisé, ainsi que des capacités des appareils des utilisateurs.
Le format de fichier Photoshop stocke les données avec une compression sans perte. Lors de la lecture d'un fichier ou d'un document, toutes les données d'image sont décompressées pour permettre un traitement plus efficace. Par conséquent, la quantité de mémoire requise peut être plusieurs fois supérieure à l'espace qu'un document utilise sur le disque ou dans le stockage cloud.
Photoshop prend en charge un très grand historique d'annulations. De nombreuses opérations dans Photoshop sont ce que nous appelons des opérations destructrices. En d'autres termes, si vous effectuez des retouches à l'aide d'un pinceau, par exemple, vous obtiendrez de nouvelles données de pixels qui pourront être tout aussi volumineuses que les données de pixels d'origine. Lorsque vous effectuez ces modifications au cours d'une longue session, de grandes quantités de données de pixels doivent être conservées pour permettre l'annulation d'opérations. Ainsi, l'historique peut atteindre plusieurs centaines de mégaoctets ou plusieurs gigaoctets de données.
Les appareils et les plates-formes, qu'il s'agisse de ordinateurs de bureau, d'appareils mobiles ou de navigateurs, gèrent tous la mémoire. Certains sont plus généreux que d'autres en ce qui concerne la quantité de mémoire qu'ils mettent à la disposition des applications. La quantité de mémoire varie également d'un appareil à l'autre, comme vous le savez lorsque vous commandez un nouvel ordinateur ou appareil et que vous spécifiez la quantité de mémoire vive (RAM) souhaitée. Un grand nombre de ces plates-formes sont également compatibles avec la mémoire virtuelle, ce qui permet à une application d'utiliser plus de mémoire que celle disponible physiquement. Cette prise en charge varie selon le système d'exploitation et l'environnement d'exécution. Dans le cas de WebAssembly, par exemple, les applications peuvent ne pas être facilement accessibles ou utilisables par les applications. De plus, les systèmes virtuels modernes ont des limites supérieures qui sont facilement dépassées par les exigences de Photoshop.
Idéalement, les applications utilisent autant de mémoire que nécessaire. Cela permet généralement d'offrir les meilleures performances à leurs utilisateurs. Toutefois, si elles utilisent trop de mémoire, elles peuvent être pénalisées par la plate-forme d'exécution ou manquer de mémoire, ce qui entraîne des échecs.
Auparavant, Photoshop devait résoudre le problème initial qui consistait à modifier les fichiers de résolution d'impression dans les premières versions de macOS, à partir de 1 Mo pour le système d'exploitation et toutes les applications. Une image pleine page de 300 ppp au format CMJN fait environ 32 Mo une fois décompressée.
Solution
Pour résoudre le problème de dépassement de la quantité de RAM disponible par l'application, Photoshop a implémenté un système de mémoire virtuelle (VM) logiciel. Photoshop utilise sa VM pour gérer les données du document, en particulier les données d'image, l'historique et l'état des annulations, ainsi que l'espace de stockage de la commande en cours. Il est également utilisé pour mettre en cache de grands blocs de données tels que des descriptions de pinceau, de sorte qu'ils n'aient à être sérialisés à partir du disque qu'une seule fois.
Prenons l'un des aspects gérés par la VM : les données d'image sont stockées à l'aide d'une représentation mipmap, qui est un ensemble pyramidal de tuiles, fournissant des données d'image dans une gamme de résolutions basse et élevée. Cela permet à Photoshop d'utiliser les données de résolution appropriées pour obtenir une réponse plus rapide lors d'un zoom avant ou d'un aperçu.
Lors de l'initialisation de l'application, Photoshop détermine la quantité de RAM disponible. Elle met une partie de côté pour le stockage des données dans la VM. La RAM restante est disponible pour les autres besoins de l'application via la bibliothèque d'exécution C++ standard. La mémoire de la VM est divisée en pages. Chaque page correspond généralement à un multiple de la taille de la page matérielle de l'appareil. Lorsqu'elle est utilisée pour des données d'image, la mémoire est référencée sous forme de tuiles. Une tuile est une zone carrée de pixels d'un seul calque comprenant les limites géométriques. Une carte utilise une ou plusieurs pages.
Photoshop crée un ou plusieurs fichiers de travail pour fournir une sauvegarde sur disque aux pages de VM. Ces fichiers de travail sont stockés dans le système de fichiers d'origine privée. La capture d'écran montre un exemple de hiérarchie de fichiers de ce type (surligné en jaune) et d'autres fichiers lors d'une session de retouche d'image. Chaque fichier de travail peut contenir plusieurs pages de VM. Lorsque la VM a besoin de davantage de sauvegarde, elle crée des fichiers de travail supplémentaires. À mesure que des pages sont libérées, leur espace dans un fichier de travail peut être réutilisé pour de nouvelles pages.
Lors du traitement des données d'image, Photoshop effectue une itération sur les tuiles et effectue des calculs de pixels. Chaque calcul peut faire référence à plusieurs tuiles. La VM est chargée de s'assurer que les tuiles source et de destination de l'itération en cours sont en mémoire, en les chargeant à partir de fichiers zéro si nécessaire. En même temps, il peut vider des pages dans les fichiers de travail pour libérer de l'espace en mémoire.
Conclusions
Les détails concrets de l'implémentation de la VM dépassent largement le cadre de ce document (et sont également la propriété d'Adobe). Grâce à la description détaillée de la solution, vous pouvez comprendre comment Photoshop peut traiter des fichiers volumineux. Le système de fichiers privé d'origine, avec son accès en lecture et en écriture aux fichiers hautement performants, est un composant clé de la solution.
Remerciements
Cet article de blog a été examiné par Oliver Unter Ecker et Rachel Andrew. Nous remercions tout particulièrement Russell Williams pour son excellente documentation sur Photoshop VM.