Dowiedz się, jak Adobe umożliwiło użytkownikom edytowanie nawet największych plików w wersji internetowej kultowej aplikacji Photoshop.
Wprowadzenie
(Ten artykuł jest też dostępny w formie filmu).
W 2021 r. firma Adobe we współpracy z zespołem inżynierów Chrome wprowadziła wersję Photoshopa na potrzeby internetu. Oprogramowanie wykorzystuje w innowacyjny sposób WebAssembly z funkcjami takimi jak SIMD, wydajne przechowywanie w prywatnym systemie plików, przestrzeń barw P3 dla obszaru roboczego oraz komponenty internetowe z Lit. W tym artykule skupiamy się na tym, jak zespół inżynierów Adobe Photoshop rozwiązał problem pracy z plikami większymi niż pamięć. W przypadku WebAssembly: jak Photoshop działa z plikami większymi niż 32-bitowa przestrzeń adresowa wasm32.
Problem
Otworzenie pliku do edycji wymaga dużej ilości pamięci, znacznie więcej niż otwarcie pliku do wyświetlania. Pliki edytowane w Photoshopie często wymagają więcej pamięci niż użytkownik ma dostępnej na swoim urządzeniu ze względu na wiele funkcji oferowanych przez to oprogramowanie, rodzaje projektowania i edytowania cyfrowego oraz możliwości urządzeń użytkowników.
Format pliku Photoshopa umożliwia kompresję bezstratną. Gdy plik lub dokument jest odczytywany, wszystkie dane obrazu są dekompresowane, aby umożliwić wydajniejsze przetwarzanie. W efekcie wymagana ilość pamięci może być kilkakrotnie większa niż ilość miejsca zajmowanego przez dokument na dysku lub w chmurze.
Photoshop obsługuje bardzo dużą historię cofnięcia. Wiele operacji w Photoshopie nazywamy operacjami destrukcyjnymi. Oznacza to, że wprowadzenie zmiany, np. malowanie pędzlem, spowoduje utworzenie nowych danych pikseli, które mogą być tak duże jak oryginalne dane pikseli. Wprowadzanie tych zmian w długiej sesji edycji powoduje powstanie dużej ilości danych o pikselach, które muszą być przechowywane, aby umożliwić cofanie operacji. W związku z tym historia może obejmować kilkaset megabajtów lub wiele gigabajtów danych.
Pamięcią zarządzają urządzenia i platformy, niezależnie od tego, czy są to komputery, urządzenia mobilne czy przeglądarki. Niektóre z nich udostępniają aplikacjom więcej pamięci niż inne. Ilość pamięci różni się też w zależności od urządzenia. Podczas zamawiania nowego komputera lub urządzenia możesz określić żądaną ilość pamięci RAM. Wiele z nich obsługuje też pamięć wirtualną, która pozwala aplikacji używać więcej pamięci niż jest fizycznie dostępnej. Obsługa może się różnić w zależności od systemu operacyjnego i czasu wykonywania, ponieważ w przypadku WebAssembly aplikacje mogą nie mieć łatwego dostępu do tych funkcji lub nie mogą ich używać. Co więcej, współczesne systemy wirtualne mają górne limity, które są łatwo przekraczane przez wymagania Photoshopa.
W idealnej sytuacji aplikacje powinny używać tyle pamięci, ile jest im potrzebne. Dzięki temu mogą oni zapewnić użytkownikom najlepszą wydajność. Jeśli jednak zajmą zbyt dużo pamięci, mogą zostać ukarane przez środowisko wykonawcze lub wyczerpać im się pamięć, co spowoduje awarię.
Pierwotnym problemem, który należało rozwiązać w Photoshopie, było edytowanie plików o wysokiej rozdzielczości przeznaczonych do druku w pierwszych wersjach macOS, które miały zaledwie 1 MB dla systemu operacyjnego i wszystkich aplikacji. Pełna strona w formacie CMYK o rozdzielczości 300 dpi ma rozmiar około 32 MB bez kompresji.
Rozwiązanie
Aby rozwiązać problem związany z przekroczeniem dostępnej ilości pamięci RAM przez aplikację, w Photoshopie zastosowano oprogramowanie systemu pamięci wirtualnej. Photoshop używa swojej maszyny wirtualnej do zarządzania danymi dokumentu, zwłaszcza danymi obrazu, całą historią i stanem cofania oraz pamięci roboczej dla bieżącego polecenia. Jest ona też używana do buforowania dużych bloków danych, takich jak opisy pędzli, aby można je było po raz pierwszy zaserializować z dysku.
Przykładem jednego z aspektów zarządzanych przez maszynę wirtualną są dane obrazu przechowywane w reprezentacji mipmap, która jest piramidalnym zbiorem płytek, dostarczającym dane obrazu w różnych rozdzielczościach od niskiej do wysokiej. Dzięki temu Photoshop może korzystać z odpowiednich danych dotyczących rozdzielczości, aby zapewnić szybszą reakcję podczas powiększenia lub wyświetlania podglądu w porównaniu z powiększeniem.
Podczas inicjowania aplikacji Photoshop określa, ile pamięci RAM jest dostępne. Odkłada część danych do przechowywania na maszynie wirtualnej. Pozostała pamięć RAM jest dostępna dla innych potrzeb aplikacji za pomocą standardowej biblioteki C++. Pamięć maszyny wirtualnej jest podzielona na strony. Każda strona jest zwykle wielokrotnością rozmiaru strony sprzętowej urządzenia. Gdy jest używana do danych obrazu, pamięć jest określana jako kafelki. Kafelek to kwadratowy obszar pikseli w ramach jednej warstwy, w tym granice geometrii. Płytka zajmuje co najmniej 1 stronę.
Photoshop tworzy co najmniej 1 plik roboczy, aby zapewnić obsługę dysków dla stron maszyn wirtualnych. Te pliki robocze są przechowywane w prywatnym systemie plików źródła. Zrzut ekranu pokazujący przykładową hierarchię plików podczas edycji obrazu: plik roboczy (zaznaczony na żółto) i inne pliki. Każdy plik tymczasowy może zawierać wiele stron VM. Gdy maszyna wirtualna potrzebuje więcej miejsca, tworzy dodatkowe pliki tymczasowe. Gdy strony zostaną zwolnione, ich miejsce w pliku roboczym może zostać ponownie wykorzystane na potrzeby nowych stron.
Podczas przetwarzania danych obrazu Photoshop przechodzi przez płytki, wykonując obliczenia pikseli. Każde obliczenie może się odwoływać do wielu płytek. Maszyna wirtualna odpowiada za to, aby płytki źródłowe i docelowe dla bieżącej iteracji były w pamięci, wczytując je z plików początkowych w miarę potrzeby. Jednocześnie może usuwać strony do plików tymczasowych, aby zwolnić miejsce w pamięci.
Podsumowanie
Szczegóły dotyczące implementacji maszyny wirtualnej wykraczają poza zakres tego dokumentu (a także są własnością firmy Adobe), ale dzięki ogólnemu opisowi rozwiązania możesz zrozumieć, jak Photoshop może obsługiwać duże pliki. Kluczowym elementem rozwiązania jest prywatny system plików źródłowego, który zapewnia wydajny dostęp do odczytu i zapisu plików.
Podziękowania
Ten post na blogu został sprawdzony przez Olivera Untereckera i Rachel Andrew. Szczególne podziękowania dla Russella Williamsa za jego wspaniałą dokumentację maszyny wirtualnej Photoshopa.