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

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

Nabeel al-Shamma
Nabeel al-Shamma

Wstęp

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

W 2021 roku firma Adobe we współpracy z zespołem inżynierów Chrome udostępniła wersję Photoshopa w internecie. To oprogramowanie umożliwia innowacyjne korzystanie z komponentów WebAssembly z funkcjami takimi jak SIMD, wysokiej wydajności pamięć w prywatnym systemie plików origin, przestrzeń kolorów P3 dla kanw oraz komponenty Web Komponenty z Lit. W tym artykule skupimy się na tym, jak zespół inżynierów Adobe Photoshop rozwiązał problem z obsługą plików większych niż mieści się w pamięci. W przypadku WebAssembly pokazujemy, jak Photoshop obsługuje pliki większe niż 32-bitowa przestrzeń adresowa wasm32.

Aplikacja Photoshop podczas edytowania obrazu logo Project Fugu.

Problem

Otwieranie pliku do edycji wymaga dużej ilości pamięci, znacznie bardziej niż otwieranie pliku do wyświetlenia. Pliki edytowane w programie Photoshop często zajmują więcej pamięci niż użytkownik ma dostęp do urządzenia. Wynika to z wielu funkcji oprogramowania, typów projektowania cyfrowego i edycji, do których jest wykorzystywane, a także możliwości urządzeń użytkownika.

Format pliku Photoshop przechowuje dane przy użyciu bezstratnej kompresji. Podczas odczytu pliku lub dokumentu wszystkie dane zdjęcia są dekompresowane, co umożliwia wydajniejsze przetwarzanie. W związku z tym ilość wymaganej pamięci może być kilka razy większa niż ilość miejsca wykorzystywanego przez dokument na dysku lub w chmurze.

Photoshop obsługuje bardzo dużą historię cofnięć. Wiele operacji w Photoshopie nazywamy działaniami destrukcyjnymi. Oznacza to, że na przykład malowanie pędzlem powoduje utworzenie nowych danych pikseli, które mogą być tak samo duże jak oryginalne dane. Wprowadzanie tych zmian podczas długiej sesji edycji powoduje generowanie dużej ilości danych pikseli, które muszą być przechowywane, aby można było cofać operacje. Dlatego historia może mieć nawet kilkaset megabajtów, a nawet wiele gigabajtów.

Urządzeniami i platformami, niezależnie od tego, czy są to komputery, urządzenia mobilne czy przeglądarki, zarządzają pamięcią. Niektóre z nich zwiększają ilość pamięci dostępnej dla aplikacji, a nie inne. Ilość pamięci różni się też w zależności od urządzenia, ponieważ wiesz, kiedy kupujesz nowy komputer lub urządzenie i określasz pożądaną ilość pamięci RAM. Wiele z tych platform obsługuje też pamięć wirtualną, która umożliwia aplikacji wykorzystanie większej ilości pamięci niż jest ona fizycznie dostępna. Obsługa ta różni się w zależności od systemu operacyjnego i środowiska wykonawczego, jak w przypadku WebAssembly, i może nie być łatwo dostępna i użyteczna dla aplikacji. Poza tym nowoczesne systemy wirtualne mają górne limity, które łatwo przewyższają wymagania programu Photoshop.

W idealnej sytuacji aplikacje powinny wykorzystywać tyle pamięci, ile potrzebują. Dzięki temu zapewniają użytkownikom najwyższą skuteczność. Jeśli jednak będą wykorzystywać zbyt dużo pamięci, platforma środowiska wykonawczego może je ukarać lub może zabraknąć pamięci, co spowoduje błędy.

Pierwotnym problemem, który musiał rozwiązać program Photoshop, było edytowanie plików z rozdzielczością wydruku we wczesnych wersjach systemu macOS, gdzie rozmiar systemu operacyjnego i wszystkich aplikacji wynosił zaledwie 1 MB. Pełnowymiarowy obraz w formacie CMYK o rozdzielczości 300 dpi ma około 32 MB po zdekompresowaniu.

Rozwiązanie

Aby rozwiązać problem aplikacji z przekroczeniem dostępnej ilości pamięci RAM, program Photoshop wdrożył programowy system pamięci wirtualnej (VM). Photoshop używa swojej maszyny wirtualnej do zarządzania danymi dokumentów, a zwłaszcza danymi obrazów, całej historii i stanu cofania, a także pamięcią działającą na potrzeby bieżącego polecenia. Służy też do buforowania dużych bloków danych, takich jak opisy pędzlem, dzięki czemu trzeba je zserializować tylko raz z dysku.

Przykładem jednego z aspektów zarządzanych przez maszynę wirtualną jest przechowywanie danych obrazów za pomocą reprezentacji mipmap, która jest piramidalnym zbiorem kafelków, zapewniając dane obrazów w zakresie od niskich do wysokich rozdzielczości. Dzięki temu Photoshop może korzystać z odpowiednich danych o rozdzielczości, aby szybciej zareagować po powiększeniu lub wyświetleniu podglądu, a nie po pomniejszeniu.

Przykładowy magazyn obrazów mipmap: głównemu obrazowi po lewej stronie towarzyszy odfiltrowane kopie o zmniejszonym rozmiarze.

Podczas inicjowania aplikacji Photoshop określa ilość dostępnej pamięci RAM. Oddziela on 1 części na dane, które będą przechowywane w maszynie wirtualnej. Reszta pamięci 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 na urządzeniu. W przypadku danych obrazu do pamięci jest przywoływana kafelki. Kafelek to kwadratowy obszar pikseli pojedynczej warstwy wraz z granicami geometrii. Kafelek zajmuje co najmniej 1 stronę.

Program Photoshop tworzy co najmniej 1 plik tymczasowy, aby zapewnić opartą na dysku kopię zapasową stron maszyn wirtualnych. Pliki te są przechowywane w prywatnym systemie plików origin. Zrzut ekranu przedstawia przykładową hierarchię plików pojedynczego pliku (wyróżnionego na żółto) i innych plików podczas sesji edytowania obrazu. Każdy plik jednorazowy może zawierać wiele stron maszyn wirtualnych. Gdy maszyna wirtualna wymaga dodatkowego wsparcia technicznego, tworzone są dodatkowe pliki tymczasowe. Po zwolnieniu stron ich miejsce w pliku jednorazowym można wykorzystać na nowych stronach.

Badanie hierarchii plików w prywatnym systemie plików źródła w Photoshop za pomocą rozszerzenia OPFS Explorer do Chrome.

Podczas przetwarzania danych obrazu Photoshop iteruje się na kafelkach, wykonując obliczenia pikseli. Każde obliczenie może odnosić się do wielu kafelków. Maszyna wirtualna odpowiada za to, aby kafelki źródła i miejsca docelowego bieżącej iteracji znajdowały się w pamięci i w razie potrzeby ładowały je od zera. Jednocześnie może wyczyścić strony i usunąć je, aby zwolnić miejsce w pamięci.

Podsumowanie

Konkretne szczegóły implementacji maszyny wirtualnej wykraczają daleko poza zakres tego dokumentu (i są również zastrzeżone dla Adobe), ale dzięki ogólnemu opisowi rozwiązania możesz zrozumieć, jak Photoshop radzi sobie z dużymi plikami. Prywatny system plików źródła z wydajnym dostępem do plików z możliwością odczytu i zapisu to kluczowy element rozwiązania.

Podziękowania

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