メモリに収まるサイズの大きいファイルを Photoshop でどのように解決したか

Adobe の象徴的な Photoshop アプリであるウェブ版で、サイズの大きいファイルでも編集できるようにした方法を紹介します。

Nabeel Al-Shamma 氏
Nabeel Al-Shamma 氏

はじめに

(この記事は動画でもご覧いただけます)。

2021 年、Adobe は Chrome エンジニアリングと連携して Photoshop のバージョンをウェブに導入しました。このソフトウェアでは、SIMDオリジン プライベート ファイル システムの高性能ストレージ、キャンバス用の P3 色空間Lit による Web Components など、WebAssembly を革新的な方法で活用しています。この記事では、Adobe Photoshop のエンジニアリングにより、メモリに収まりきらない大きなファイルの扱い方を考察します。WebAssembly の場合、Photoshop が 32 ビット アドレス空間の wasm32 より大きいファイルを処理する仕組みについて説明します。

Project Fugu ロゴの画像を編集している Photoshop アプリ。

問題

ファイルを編集用に開くには大量のメモリが必要です。ファイルを開いて閲覧するよりもはるかに時間がかかります。Photoshop で編集されたファイルは、ソフトウェアには多くの機能、使用するデジタル デザインや編集の種類、ユーザー デバイスの機能があるため、ユーザーが使用できるデバイスよりも多くのメモリを必要とすることがよくあります。

Photoshop ファイル形式の場合、データは可逆圧縮で保存されます。ファイルやドキュメントを読み取るときは、すべての画像データが解凍され、処理効率が向上します。その結果、ドキュメントがディスクやクラウド ストレージで使用する容量よりも数倍のメモリが必要になる可能性があります。

Photoshop では非常に大規模な元に戻す履歴がサポートされます。Photoshop の多くのオペレーションは、破壊的オペレーションと呼ばれます。つまり、ブラシでペイントするなどの編集を行うと、元のピクセルデータと同じサイズの新しいピクセルデータが作成されます。長時間の編集セッションでこのような編集を行うと大量のピクセルデータが生成され、元に戻す操作をサポートするために保持する必要があります。したがって、その履歴は数百メガバイトから数ギガバイトに及ぶ可能性があります。

メモリは、パソコン、モバイル デバイス、ブラウザなど、デバイスとプラットフォームで管理されています。アプリケーションで利用できるメモリ量に関して、他のものより寛大なものもあります。また、メモリの容量はデバイスによって異なります。これは、新しいパソコンやデバイスを注文して必要なランダム アクセス メモリ(RAM)の容量を指定することです。これらのプラットフォームの多くは「仮想メモリ」もサポートしています。仮想メモリにより、アプリは物理的に利用可能なメモリよりも多くのメモリを使用できます。オペレーティング システムとランタイムによってこのサポートは異なります。WebAssembly の場合と同様に、アプリケーションから簡単にアクセスまたは使用できない可能性があります。さらに、最新の仮想システムには上限があり、Photoshop の要件を簡単に超えてしまいます。

アプリケーションは必要なだけメモリを使用するのが理想的です。これにより、通常はユーザーに最高のパフォーマンスを提供できます。ただし、メモリ使用量が多すぎると、ランタイム プラットフォームによってペナルティが課されたり、メモリが不足して失敗したりする可能性があります。

過去の注意点として、Photoshop が解決する必要があった最初の問題は、macOS の初期バージョンで印刷解像度ファイルを編集することでした。OS とすべてのアプリケーションで 1 MB 未満でした。CMYK 形式の 300 dpi の全画面画像は、圧縮していない状態で約 32 MB です。

ソリューション

このアプリが RAM の空き容量を超過するという問題を解決するために、Photoshop がソフトウェア仮想メモリシステム(VM)を実装しました。Photoshop では VM を使用して、ドキュメント データ、特に画像データ、すべての元に戻す履歴と状態、現在のコマンドの作業ストレージを管理します。また、筆遣いなど、大量のデータブロックをキャッシュ保存し、ディスクから一度だけシリアル化する必要も生じます。

VM によって管理される要素の一つの例として、画像データは mipmapmipmap 表現を使用して保存されます。mipmap はピラミッド状のタイルのセットで、低解像度から高解像度の範囲で画像データを提供します。これにより、Photoshop が適切な解像度データで処理できるようになり、拡大時やプレビュー表示時、ズームアウト後の反応が速くなります。

mipmap 画像ストレージの例: 左側の主画像には、縮小されたサイズのコピーがフィルタされて表示されています。

Photoshop は、アプリケーションの初期化中に使用可能な RAM の量を特定します。データの一部を VM に保存するための部分を確保します。残りの RAM は、標準の C++ ランタイム ライブラリを介して他のアプリで使用できるようになります。VM メモリは複数のページに分割されます。通常、各ページはデバイスのハードウェア ページサイズの倍数になります。画像データに使用される場合、メモリはタイルとして参照されます。タイルは、ジオメトリ境界を含む、単一レイヤのピクセルの正方形領域です。タイルは 1 つ以上のページを使用します。

Photoshop は 1 つ以上のスクラッチ ファイルを作成して、VM ページにディスクベースのバックアップを提供します。このスクラッチ ファイルは、元の非公開ファイル システムに保存されます。このスクリーンショットは、画像編集セッション中の、そのようなスクラッチ ファイル(黄色でハイライト表示)とその他のファイルのファイル階層の例を示しています。各スクラッチ ファイルには、多数の VM ページを含めることができます。VM でより多くのバッキングが必要になると、追加のスクラッチ ファイルが作成されます。ページが解放されると、スクラッチ ファイル内のスペースは新しいページに再利用できるようになります。

OPFS Explorer の Chrome 拡張機能を使用して、Photoshop のオリジンの非公開ファイル システムのファイル階層を検査します。

Photoshop は、画像データの処理時にタイルに対して反復処理を行い、ピクセル計算を行います。1 つの計算で複数のタイルを参照できます。VM は、現在のイテレーションのソースタイルと宛先タイルがメモリ内にあることを確認し、必要に応じてスクラッチ ファイルからそれらを読み込みます。同時に、ページをスクラッチ ファイルにフラッシュして、メモリの容量を確保できます。

まとめ

VM の具体的な実装の詳細はこのドキュメントの範囲をはるかに超える(そして Adobe 独自の情報でもあります)が、ソリューションのおおまかな説明とともに、Photoshop で大きなファイルを処理する方法を理解できるようになっています。高パフォーマンスなファイルへの読み書きアクセス権を持つ元のプライベート ファイル システムは、このソリューションの重要な要素です。

謝辞

このブログ投稿は、Oliver Unter Ecker と Rachel Andrew によるレビューです。Photoshop VM に関する優れたドキュメントを提供してくれた Russell Williams に心から感謝します。