Jak rozwiązano problem z plikami większymi niż można zmieścić w pamięci w Photoshopie

Dowiedz się, jak firma Adobe umożliwiła użytkownikom edytowanie nawet największych plików w internetowej wersji swojej kultowej aplikacji Photoshop.

Wstęp

(Ten artykuł jest również dostępny w formie filmu).

W 2021 r. firma Adobe we współpracy z inżynierami Chrome udostępniła wersję programu Photoshop w internecie. To oprogramowanie w innowacyjny sposób wykorzystuje funkcje WebAssembly, korzystając z takich funkcji jak SIMD, wysoka wydajność pamięci masowej w prywatnym systemie plików źródła, przestrzeń kolorów P3 dla obiektów canvas i komponenty Web z Lit. W tym artykule chcemy skupić się na tym, jak inżynier z programu Adobe Photoshop poradził sobie z pracą z plikami, które są większe niż mieści się w pamięci. W przypadku WebAssembly pokazujemy również, jak Photoshop obsługuje pliki większe niż 32-bitowa przestrzeń adresowa Wasm32.

Aplikacja Photoshop podczas edytowania obrazu logo Project Fugu.

Problem

Otwarcie pliku w celu edycji wymaga dużej ilości pamięci, znacznie więcej niż otwarcie pliku do wyświetlania. Pliki edytowane w Photoshopie często potrzebują więcej pamięci niż użytkownik ma na swoim urządzeniu ze względu na liczne funkcje oferowane przez to oprogramowanie, metody projektowania i edycji cyfrowych plików oraz możliwości urządzeń użytkownika.

Format pliku Photoshopa umożliwia przechowywanie danych w kompresji bezstratnej. Podczas odczytywania pliku lub dokumentu wszystkie dane obrazu są dekompresowane, aby zwiększyć wydajność przetwarzania. W efekcie wymagana ilość pamięci może być kilkakrotnie większa niż ilość miejsca używanego przez dokument na dysku lub w chmurze.

Photoshop obsługuje bardzo dużą historię cofania zmian. Wiele operacji w Photoshopie to tak zwane operacje destrukcyjne. Oznacza to, że na przykład zmiana, np. malowanie pędzlem, spowoduje wygenerowanie nowych danych pikseli, które mogą być porównywalne z oryginalnymi danymi. Wprowadzanie tych zmian podczas długiej sesji edycji powoduje wygenerowanie dużej ilości danych pikseli, które trzeba przechowywać w pobliżu, aby można było cofnąć operacje cofania. W ten sposób rozmiar historii może wzrosnąć do kilkuset megabajtów lub wielu gigabajtów danych.

Urządzenia i platformy – komputery, urządzenia mobilne czy przeglądarki – wszystkie zarządzają pamięcią. Niektóre z nich są bardziej hojne niż inne, jeśli chodzi o ilość pamięci dostępnej dla aplikacji. Ilość pamięci może się też różnić w zależności od urządzenia, ponieważ wiesz, kiedy zamawiasz nowy komputer lub urządzenie i określasz pożądaną ilość pamięci RAM. Wiele z tych platform obsługuje też pamięć wirtualną, co pozwala aplikacjom wykorzystywać więcej pamięci, niż jest fizycznie dostępna. Ta obsługa różni się w zależności od systemu operacyjnego i środowiska wykonawczego (jak w przypadku WebAssembly) może ona nie być łatwo dostępna lub niedostępna dla aplikacji. Poza tym nowoczesne systemy wirtualne mają wysokie limity, które można łatwo przekroczyć przez wymagania programu Photoshop.

W idealnej sytuacji aplikacje wykorzystywałyby tyle pamięci, ile potrzebują. Zwykle pozwala im to zapewniać użytkownikom największą skuteczność. Jeśli jednak zużywają zbyt dużo pamięci, platforma środowiska wykonawczego może mieć negatywny wpływ na ich działanie lub zabraknie pamięci, co może prowadzić do awarii.

Pierwotny problem, który musiał rozwiązać Photoshop, polegał na edytowaniu plików w rozdzielczości wydruku we wczesnych wersjach systemu macOS, gdzie system operacyjny i wszystkie aplikacje używały tylko 1 MB. Obraz na całą stronę w formacie CMYK o rozdzielczości 300 dpi ma rozmiar około 32 MB po zdekompresowaniu.

Rozwiązanie

Aby rozwiązać problem przekraczania dostępnej ilości pamięci RAM w aplikacji, w programie Photoshop zastosowano programowy system pamięci wirtualnej (maszyna wirtualna). Photoshop używa maszyny wirtualnej do zarządzania danymi dokumentów, w szczególności danymi obrazów, całą historią i stanem cofnięć, a także miejscem na dane bieżącego polecenia. Służy też do buforowania dużych bloków danych, takich jak opisy pędzli, dzięki czemu wystarczy, że zostaną one serializowane z dysku tylko raz.

Przykładem jednego z aspektów zarządzanych przez maszynę wirtualną jest przechowywanie danych obrazów z użyciem reprezentacji mipmap, czyli piramidalnych kafelków, które dostarczają danych obrazu w zakresie od niskiej do wysokiej rozdzielczości. Dzięki temu Photoshop może operować na danych o odpowiedniej rozdzielczości, aby przyspieszyć działanie, gdy powiększysz obraz lub oglądasz podgląd, a nie pomniejszony.

Przykładowy plik do przechowywania obrazów mipmap: obrazowi głównemu po lewej stronie towarzyszy filtrowane kopie o zmniejszonym rozmiarze.

Podczas inicjowania aplikacji Photoshop określa ilość dostępnej pamięci RAM. Wybiera 1 część na potrzeby przechowywania danych w maszynie wirtualnej. Pozostała pamięć RAM jest dostępna na potrzeby innych aplikacji za pomocą standardowej biblioteki środowiska wykonawczego C++. Pamięć maszyny wirtualnej jest podzielona na strony. Każda strona jest zwykle wielokrotnością rozmiaru strony sprzętowej urządzenia. W przypadku danych obrazów pamięć jest podawana jako kafelki. Kafelek to kwadratowy obszar składający się z pikseli pojedynczej warstwy, w tym granice geometryczne. Kafelek zajmuje co najmniej 1 stronę.

Photoshop tworzy co najmniej 1 plik tymczasowy, aby udostępniać dyskową kopię zapasową stron maszyn wirtualnych. Te pliki są przechowywane w prywatnym systemie plików źródła. Zrzut ekranu pokazuje przykładową hierarchię plików próbki (wyróżnioną na żółto) i innych plików podczas sesji edytowania obrazu. Każdy plik tymczasowy może zawierać wiele stron maszyn wirtualnych. Gdy maszyna wirtualna potrzebuje więcej kopii zapasowych, tworzy dodatkowe pliki z danymi tymczasowymi. W miarę zwalniania stron miejsce w zdrapce pliku można ponownie wykorzystać na nowych stronach.

Sprawdzanie hierarchii plików prywatnego systemu plików w usłudze Photoshop za pomocą rozszerzenia do Chrome OPFS Explorer.

Podczas przetwarzania danych obrazu Photoshop powtarza się nad kafelkami, wykonując obliczenia w pikselach. Każde obliczenia może odwoływać się do wielu kafelków. Maszyna wirtualna odpowiada za zapewnienie, że kafelki źródła i miejsca docelowego bieżącej iteracji są w pamięci, w razie potrzeby ładując je od zera. Jednocześnie może usunąć strony z plików podstawowych, aby zwolnić miejsce w pamięci.

Podsumowanie

Konkretne szczegóły implementacji maszyny wirtualnej wykraczają poza zakres tego dokumentu (i są zastrzeżone dla firmy Adobe), jednak ogólny opis rozwiązania pozwala nam zrozumieć, jak Photoshop radzi sobie z dużymi plikami. Kluczowym komponentem rozwiązania jest prywatny system plików punktu początkowego z zaawansowanymi uprawnieniami do odczytu i zapisu plików.

Podziękowania

Ten post został zrecenzowany przez Olivera Untera Eckera i Rachel Andrew. Specjalne podziękowania dla Russella Williamsa za świetną dokumentację maszyny wirtualnej Photoshopa.