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

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

Введение

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

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

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

Проблема

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

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

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

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

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

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

Решение

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

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

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

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

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

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

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

Выводы

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

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

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