Как Photoshop решил проблему работы с файлами, размер которых превышает размер памяти

Узнайте, как компании Adobe удалось предоставить пользователям возможность редактировать даже самые большие файлы в веб-версии своего культового приложения Photoshop.

Введение

(Эта статья также доступна в виде видео.)

В 2021 году Adobe совместно с Chrome Engineering представили версию Photoshop в Интернете . Программное обеспечение инновационно использует WebAssembly с такими функциями, как SIMD , высокопроизводительное хранилище в исходной частной файловой системе , цветовое пространство P3 для холста и веб-компоненты с Lit. В этой статье мы хотим сосредоточиться на том, как инженеры Adobe Photoshop решили работу с файлами, размер которых превышает размер памяти. И, в случае WebAssembly, как Photoshop работает с файлами, размер которых превышает 32-битное адресное пространство wasm32.

Приложение Photoshop во время редактирования изображения логотипа проекта Fugu.

Проблема

Открытие файла для редактирования требует большого объема памяти, значительно больше, чем открытие файла для просмотра. Файлы, отредактированные в Photoshop, часто требуют больше памяти, чем доступно пользователю на его устройстве, из-за множества функций, предлагаемых программным обеспечением, типов цифрового дизайна и редактирования, для которых оно используется, и возможностей пользовательских устройств.

Формат файла Photoshop хранит данные со сжатием без потерь. При чтении файла или документа все данные изображения распаковываются для более эффективной обработки. В результате объем требуемой памяти может в несколько раз превышать объем места, которое документ занимает на диске или в облачном хранилище.

Photoshop поддерживает очень большую историю отмен. Многие операции в Photoshop являются тем, что мы называем деструктивными операциями. То есть, внесение изменений, например, рисование кистью, приведет к появлению новых пиксельных данных, которые могут быть такими же большими, как и исходные пиксельные данные. Внесение этих изменений в длительном сеансе редактирования приводит к появлению больших объемов пиксельных данных, которые необходимо хранить для поддержки операций отмены. Таким образом, история может вырасти до нескольких сотен мегабайт или многих гигабайт данных.

Устройства и платформы, будь то настольные компьютеры, мобильные устройства или браузеры, все управляют памятью. Некоторые из них более щедры, чем другие, в том, сколько памяти они предоставляют приложениям. Объем памяти также варьируется от устройства к устройству, как вы знаете, когда заказываете новый компьютер или устройство и указываете желаемый объем оперативной памяти (ОЗУ). Многие из этих платформ также поддерживают виртуальную память , что позволяет приложению использовать больше памяти, чем физически доступно. Эта поддержка зависит от операционной системы и среды выполнения, как в случае WebAssembly, может быть недоступна или не использоваться приложениями. Вдобавок ко всему, современные виртуальные системы имеют верхние пределы, которые легко превышаются требованиями Photoshop.

В идеале приложения должны использовать столько памяти, сколько им нужно. Это обычно позволяет им предоставлять пользователям наилучшую производительность. Однако если они используют слишком много памяти, они могут быть наказаны платформой выполнения или могут исчерпать память, что приведет к сбоям.

В качестве исторической справки, изначальной проблемой, которую должен был решить Photoshop, было редактирование файлов разрешения печати в ранних версиях macOS, размером всего 1 МБ для ОС и всех приложений. Изображение полной страницы с разрешением 300 точек на дюйм в CMYK занимает около 32 МБ в несжатом виде.

Решение

Чтобы решить проблему превышения приложением доступного объема оперативной памяти, Photoshop реализовал программную систему виртуальной памяти (VM). Photoshop использует свою VM для управления данными документа, особенно данными изображений, всей историей отмен и состоянием, а также рабочим хранилищем для текущей команды. Она также используется для кэширования больших блоков данных, таких как описания кистей, так что их нужно сериализовать с диска только один раз.

В качестве примера одного из аспектов, управляемых VM, данные изображения хранятся с использованием представления mipmap , которое представляет собой пирамидальный набор плиток, предоставляя данные изображения в диапазоне от низкого до высокого разрешения. Это позволяет Photoshop работать с соответствующими данными разрешения для более быстрого отклика при увеличении или просмотре предварительного просмотра, по сравнению с уменьшением масштаба.

Пример хранения mipmap-изображения: основное изображение слева сопровождается отфильтрованными копиями уменьшенного размера.

Во время инициализации приложения Photoshop определяет, сколько оперативной памяти доступно. Он выделяет одну часть для данных, которые будут храниться в виртуальной машине. Оставшаяся часть оперативной памяти доступна для других потребностей приложения через стандартную библиотеку времени выполнения C++. Память виртуальной машины разбита на страницы . Каждая страница обычно кратна размеру аппаратной страницы для устройства. При использовании для данных изображений память обозначается как плитка. Плитка — это квадратная область пикселей одного слоя, включая геометрические границы. Плитка занимает одну или несколько страниц.

Photoshop создает один или несколько файлов скретча для предоставления дискового резерва для страниц VM. Эти файлы скретча хранятся в исходной частной файловой системе . На снимке экрана показана примерная иерархия файлов такого файла скретча (выделена желтым) и других файлов во время сеанса редактирования изображения. Каждый файл скретча может содержать много страниц VM. Когда VM требуется больше резерва, она создает дополнительные файлы скретча. По мере освобождения страниц их место в файле скретча можно повторно использовать для новых страниц.

Проверка исходной иерархии файловой системы Photoshop с помощью расширения OPFS Explorer для Chrome.

При обработке данных изображения Photoshop выполняет итерации по плиткам, выполняя пиксельные вычисления. Каждое вычисление может ссылаться на несколько плиток. VM отвечает за то, чтобы исходные и целевые плитки для текущей итерации находились в памяти, загружая их из файлов с нуля по мере необходимости. В то же время он может сбрасывать страницы в файлы с нуля, чтобы освободить место в памяти.

Выводы

Хотя конкретные детали реализации VM выходят далеко за рамки этого документа (и также являются собственностью Adobe), с помощью высокоуровневого описания решения мы поставили вас в положение, в котором вы можете понять, как Photoshop может работать с большими файлами. Исходная частная файловая система с ее высокопроизводительным доступом для чтения и записи файлов является ключевым компонентом решения.

Благодарности

Этот пост в блоге был проверен Оливером Унтером Экером и Рейчел Эндрю. Особая благодарность Расселу Уильямсу за его прекрасную документацию по Photoshop VM.