Photoshop a résolu le problème des fichiers trop volumineux pour tenir en mémoire

Découvrez comment Adobe a réussi à permettre aux utilisateurs de modifier même les fichiers les plus volumineux dans la version Web de son application iconique Photoshop.

Introduction

(Cet article est également disponible sous forme de vidéo.)

En 2021, Adobe et l'équipe d'ingénieurs Chrome ont lancé une version de Photoshop sur le Web. Le logiciel utilise de manière innovante WebAssembly avec 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 l'équipe d'ingénierie Adobe Photoshop a résolu le problème de traitement des fichiers plus volumineux que la mémoire ne peut contenir. Et, dans le cas de WebAssembly, comment Photoshop fonctionne avec des fichiers plus volumineux que l'espace d'adressage 32 bits de wasm32.

Application Photoshop lors de la retouche d'une image du logo du projet Fugu.

Problème

L'ouverture d'un fichier pour le modifier nécessite une grande quantité de mémoire, beaucoup plus que pour l'ouvrir en vue de le consulter. Les fichiers édités dans Photoshop nécessitent souvent plus de mémoire que l'utilisateur n'en a à sa disposition sur son appareil, en raison des nombreuses fonctionnalités proposées par le logiciel, des types de conception et de retouche numérique pour lesquels il est utilisé, ainsi que des fonctionnalités des appareils des utilisateurs.

Le format de fichier Photoshop stocke les données avec une compression sans perte. Lorsqu'un fichier ou un document est lu, 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 disque ou dans un espace de stockage cloud.

Photoshop prend en charge un très grand historique des actions annulées. De nombreuses opérations dans Photoshop sont ce que nous appelons des opérations destructives. Autrement dit, si vous effectuez une modification, comme peindre avec un pinceau, de nouvelles données de pixel seront créées, qui peuvent être aussi volumineuses que les données de pixel d'origine. Effectuer ces modifications lors d'une longue session de retouche génère de grandes quantités de données de pixel qui doivent être conservées pour permettre les opérations d'annulation. L'historique peut ainsi atteindre plusieurs centaines de mégaoctets, voire plusieurs gigaoctets de données.

Les appareils et les plates-formes, qu'il s'agisse d'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 termes de mémoire disponible pour les applications. La quantité de mémoire varie également d'un appareil à l'autre, comme vous le savez lorsque vous commandez un nouvel ordinateur ou un nouvel appareil et que vous spécifiez la quantité de mémoire vive (RAM) souhaitée. Beaucoup de ces plates-formes prennent également en charge la mémoire virtuelle, qui permet à une application d'utiliser plus de mémoire que celle physiquement disponible. Cette compatibilité varie selon le système d'exploitation et l'environnement d'exécution. Dans le cas de WebAssembly, elle peut ne pas être facilement accessible ni utilisable 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 devraient utiliser autant de mémoire qu'elles en ont besoin. Cela leur permet généralement de fournir les meilleures performances à leurs utilisateurs. Toutefois, s'ils utilisent trop de mémoire, ils peuvent être pénalisés par la plate-forme d'exécution ou manquer de mémoire, ce qui entraîne des échecs.

Pour information, le problème initial que Photoshop devait résoudre était le montage de fichiers de résolution d'impression sur les premières versions de macOS, avec une mémoire de 1 Mo seulement pour l'OS et toutes les applications. Une image pleine page en CMJN de 300 dpi non compressée occupe environ 32 Mo.

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 de document, en particulier les données d'image, l'ensemble de l'historique des actions "Annuler" et l'état, ainsi que l'espace de stockage de travail de la commande en cours. Il est également utilisé pour mettre en cache de grands blocs de données tels que les descriptions de pinceaux afin qu'ils ne doivent être sérialisés à partir du disque qu'une seule fois.

Par exemple, 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 à une plage de résolutions allant de basse à haute. Cela permet à Photoshop de travailler sur les données de résolution appropriées pour une réponse plus rapide lorsque vous effectuez un zoom avant ou que vous regardez un aperçu, par rapport au zoom arrière.

Exemple de stockage d'images mipmap: l'image principale à gauche est accompagnée de copies filtrées de taille réduite.

Lors de l'initialisation de l'application, Photoshop détermine la quantité de RAM disponible. Il réserve une partie 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 est généralement un multiple de la taille de page matérielle de l'appareil. Lorsqu'elle est utilisée pour les 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'une seule couche, y compris les limites de géométrie. Une carte occupe une ou plusieurs pages.

Photoshop crée un ou plusieurs fichiers de travail pour fournir un support sur disque aux pages de VM. Ces fichiers temporaires sont stockés dans le système de fichiers privé d'origine. La capture d'écran montre un exemple de hiérarchie de fichiers pour un tel fichier temporaire (en jaune) et d'autres fichiers lors d'une session de retouche d'image. Chaque fichier de travail peut contenir de nombreuses pages de VM. Lorsque la VM a besoin de plus de sauvegarde, elle crée des fichiers d'échange supplémentaires. Lorsque des pages sont libérées, leur espace dans un fichier temporaire peut être réutilisé pour de nouvelles pages.

Inspection de la hiérarchie des fichiers du système de fichiers privé d'origine de Photoshop avec l'extension Chrome OPFS Explorer.

Lors du traitement des données d'image, Photoshop itère sur les tuiles et effectue des calculs de pixels. Chaque calcul peut faire référence à plusieurs cartes. 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 de démarrage si nécessaire. En même temps, il peut vider des pages dans les fichiers de travail pour libérer de l'espace dans la mémoire.

Conclusions

Bien que les détails concrets de l'implémentation de la VM dépassent largement le cadre de ce document (et soient également propriétaires d'Adobe), la description générale de la solution vous permet de comprendre comment Photoshop peut gérer les fichiers volumineux. Le système de fichiers privé d'origine, avec son accès en lecture et en écriture hautement performant aux fichiers, est un composant clé de la solution.

Remerciements

Cet article de blog a été relu par Oliver Unter Ecker et Rachel Andrew. Remerciements particuliers à Russell Williams pour son excellente documentation sur la VM Photoshop.