有名な Photoshop アプリのウェブ版で、Adobe がサイズの大きいファイルでも編集できるようにした方法をご紹介します。
はじめに
(この記事は動画でもご覧いただけます)。
2021 年、Adobe は Chrome エンジニアリングと協力して Photoshop のバージョンをウェブで公開しました。WebAssembly は、SIMD、元のプライベート ファイル システムの高性能ストレージ、キャンバスの P3 色空間、Lit を使用したウェブ コンポーネントなどの機能によって、WebAssembly を革新的に活用しています。この記事では、メモリに収まりきらない大きなファイルの処理を Adobe Photoshop のエンジニアリングがどのように解決したかに焦点を当てたいと思います。WebAssembly の場合、wasm32 の 32 ビット アドレス空間を超えるファイルを Photoshop で処理する方法についても説明します。
問題
ファイルを編集用に開くには大量のメモリが必要で、表示用にファイルを開く場合よりもはるかに多くのメモリが必要です。Photoshop でファイルを編集する場合、多くの機能、使用するデジタル デザインや編集の種類、ユーザーのデバイスの機能のために、ユーザーがデバイスで使用できるメモリよりも多くのメモリが必要になります。
Photoshop ファイル形式は、可逆圧縮でデータを保存します。ファイルまたはドキュメントを読み取る際に、画像データはすべて解凍され、処理効率が向上します。その結果、必要なメモリ量は、ドキュメントがディスク上やクラウド ストレージ上で使用する容量よりも数倍大きくなる可能性があります。
Photoshop では、非常に長い元に戻す履歴がサポートされています。Photoshop の多くの操作は破壊的な操作と呼ばれます。つまり、ブラシでペイントするなど編集を行うと、元のピクセルデータと同程度の大きさの新しいピクセルデータが生成されることになります。このような編集を長時間の編集セッションで行った場合、大量のピクセルデータが生成され、元に戻す処理をサポートするために残しておく必要があります。そのため、履歴が数百メガバイトから数ギガバイトになることもあります。
メモリは、デスクトップ マシンであれ、モバイル デバイスであれ、ブラウザであれ、すべてのデバイスとプラットフォームがすべて管理しています。アプリケーションに提供するメモリ容量の自由度が高いものもあります。新しいパソコンやデバイスを注文する際に必要なランダムアクセス メモリ(RAM)の容量を指定するため、メモリ容量もデバイスによって異なります。これらのプラットフォームの多くは仮想メモリもサポートしているため、アプリケーションは物理的に利用可能な量よりも多くのメモリを使用できます。WebAssembly の場合と同様に、このサポートはオペレーティング システムやランタイムによって異なりますが、アプリケーションによるアクセスや使用が困難な場合があります。そのうえ、最新の仮想システムには上限があります。これは Photoshop の要件で簡単に超えられます。
アプリケーションが必要なだけメモリを使用することが理想的です。これにより、通常はユーザーに最高のパフォーマンスを提供できます。ただし、メモリ使用量が多すぎると、ランタイム プラットフォームによってペナルティが課されたり、メモリ不足に陥ったりしてエラーが発生する可能性があります。
歴史的に、Photoshop が解決する必要があった当初の問題は、macOS の初期バージョンで印刷解像度ファイルを編集するというものでした。これは、OS およびすべてのアプリケーションでわずか 1 MB です。CMYK の 300 dpi のフルページ画像は、非圧縮で約 32 MB です。
ソリューション
アプリが利用可能な RAM 容量を超える問題を解決するために、Photoshop はソフトウェア仮想メモリシステム(VM)を実装しました。Photoshop の VM を使用して、ドキュメント データ(特に画像データ)、元に戻すすべての履歴と状態、現在のコマンドの作業ストレージが管理されます。また、ブラシの説明などの大きなデータブロックをキャッシュに保存して、ディスクからシリアル化する必要があるデータを一度だけキャッシュする場合にも使用されます。
VM によって管理されるアスペクトの一例として、mipmap 表現を使用して画像データが保存されます。mipmap は、ピラミッド型のタイルのセットで、低解像度から高解像度まで画像データを提供します。これにより、Photoshop は適切な解像度データで動作し、ズームインやプレビューの表示をズームアウトするよりも迅速に行うことができます。
Photoshop により、アプリケーションの初期化時に使用可能な RAM の容量が決定されます。VM に保存するデータの一部を確保します。残りの RAM は、標準の C++ ランタイム ライブラリを介して他のアプリケーションのニーズに利用できます。VM のメモリは複数のページに分割されます。通常、各ページはデバイスのハードウェア ページサイズの倍数です。画像データに使用する場合、メモリはタイルとして参照されます。タイルは、ジオメトリの境界を含む単一レイヤのピクセルの正方形領域です。タイルは 1 つ以上のページを使用します。
Photoshop は、VM ページ用にディスクベースのバッキングを提供するために 1 つ以上のスクラッチ ファイルを作成します。これらのスクラッチ ファイルは、元の非公開ファイル システムに保存されます。スクリーンショットは、画像編集セッション中のこのようなスクラッチファイル(黄色でハイライト)とその他のファイルの例示的なファイル階層を示しています。各スクラッチ ファイルには多数の VM ページを含めることができます。さらにバッキングが必要になると、追加のスクラッチ ファイルが作成されます。ページが解放されると、スクラッチ ファイルの領域を新しいページに再利用できます。
画像データを処理する際、Photoshop はタイルを反復処理してピクセル計算を行います。1 回の計算で複数のタイルを参照できます。VM は、現在のイテレーションのソースタイルと宛先タイルをメモリ内に確実に置き、必要に応じてゼロ ファイルから読み込む役割を担います。同時に、ページをスクラッチ ファイルにフラッシュして、メモリ内のスペースを確保できます。
まとめ
VM の具体的な実装の詳細はこのドキュメントの範囲をはるかに超えています(Adobe 独自のものですが、ソリューションの概要を説明するため、Photoshop で大きなファイルを扱う方法を紹介します)。ファイルに対するパフォーマンスの高い読み取り / 書き込みアクセス権を持つ元の非公開ファイル システムは、このソリューションの重要なコンポーネントです。
謝辞
このブログ投稿は、Oliver Unter Ecker と Rachel Andrew によってレビューされました。Photoshop VM に関する素晴らしいドキュメントを提供してくれた Russell Williams に感謝します。