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

Adobe が、象徴的な Photoshop アプリのウェブ バージョンで、最大のファイルでも編集できるようにした方法を学びます。

はじめに

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

2021 年、Adobe は Chrome エンジニアリングと共同で、Photoshop のバージョンをウェブに導入しました。このソフトウェアは、SIMDオリジンの非公開ファイル システム内の高パフォーマンス ストレージ、キャンバスの P3 カラー空間Lit を使用したウェブ コンポーネントなどの機能により、WebAssembly を革新的に使用しています。この記事では、メモリに収まらないサイズのファイルの処理を Adobe Photoshop エンジニアリングがどのように解決したかについて説明します。また、WebAssembly の場合、Photoshop が wasm32 の 32 ビット アドレス空間よりも大きいファイルでどのように動作するかも確認してください。

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

問題

ファイルを編集用に開くには、ファイルを表示用に開く場合よりもはるかに多くのメモリが必要です。Photoshop で編集するファイルは、ソフトウェアが提供する多くの機能、使用されるデジタル デザインと編集の種類、ユーザーのデバイスの機能により、ユーザーのデバイスで使用できるメモリよりも多くのメモリを必要とすることがよくあります。

Photoshop ファイル形式では、ロスレス圧縮でデータが保存されます。ファイルまたはドキュメントが読み取られると、すべての画像データが解凍され、より効率的な処理が可能になります。そのため、必要なメモリ量は、ドキュメントがディスクまたはクラウド ストレージで使用する容量の何倍にもなることがあります。

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

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

理想的には、アプリケーションは必要なだけメモリを使用します。一般的に、これによりユーザーに最適なパフォーマンスを提供できます。ただし、メモリ使用量が多すぎると、ランタイム プラットフォームによってペナルティが科せられたり、メモリ不足が発生して障害が発生したりする可能性があります。

歴史的な背景として、Photoshop が解決する必要があった元の問題は、初期バージョンの macOS で、OS とすべてのアプリケーションが 1 MB 未満の印刷解像度ファイルを編集することです。CMYK の 300 dpi の全ページ画像は、非圧縮で約 32 MB です。

ソリューション

アプリで使用可能な RAM の量を超える問題を解決するため、Photoshop にはソフトウェア仮想メモリ システム(VM)が実装されています。Photoshop は VM を使用して、ドキュメントデータ(特に画像データ)、すべての元に戻す履歴と状態、現在のコマンドの作業用ストレージを管理します。また、ブラシの説明などの大規模なデータブロックをキャッシュに保存し、ディスクから 1 回だけシリアル化できるようにするためにも使用されます。

VM によって管理される側面の例として、画像データは MIPMAP 表現を使用して保存されます。これは、ピラミッド状のタイルのセットであり、低解像度から高解像度までの範囲で画像データを提供します。これにより、Photoshop は適切な解像度のデータで動作し、ズームイン時やプレビューの表示時に、ズームアウト時よりも迅速に応答できるようになります。

mipmap 画像ストレージの例: 左側のメイン画像には、サイズが縮小されたフィルタリングされたコピーが付属しています。

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

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

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

画像データを処理する際、Photoshop はタイルを反復処理してピクセル計算を行います。各計算で複数のタイルを参照できます。VM は、現在の反復処理のソースタイルおよび宛先タイルがメモリに確実に存在するようにし、必要に応じてスクラッチファイルから読み込みます。同時に、ページをスクラッチ ファイルにフラッシュしてメモリ内のスペースを確保することもできます。

まとめ

VM の具体的な実装の詳細は、このドキュメントの範囲をはるかに超える(また、Adobe 独自のもの)ため、ソリューションの概要を説明することで、Photoshop が大きなファイルを処理する仕組みを理解できるようにしました。ファイルへの高パフォーマンスの読み取り / 書き込みアクセスを備えた送信元のプライベート ファイル システムは、このソリューションの重要なコンポーネントです。

謝辞

このブログ投稿は、Oliver Unter Ecker と Rachel Andrew が確認しました。Photoshop VM に関する優れたドキュメントを作成してくれた Russell Williams に感謝します。