AfterEffectsのプロキシについて Part.2

February 7, 2011
Part.1からの続きです。HS_ProxyManagerリリース記念で書き始めたこの記事ですが、かなり間が空いてしまいました(実はドラフト状態で公開忘れて放置してました)。とりあえず前回は、ざっとプロキシの使い方を説明しただけで終ってしまったので、後編ではAfterEffectsのプロキシ作成時の注意点などについて書いてみようと思います。

4.AfterEffectsのディスクキャッシュ
まず、AfterEffectsのプロキシが使いにくいと書いてしまいましたが、実はプロキシそのものに問題があるというよりもAfterEffectsの場合はディスクキャッシュの弱さと、仕様上の問題があります。前回書いたようなプロキシのファイルを指定して設定するというような機能は他のソフト(Nuke, Composite, Shakeなど)でもそれほどAfterEffectsと違いがある訳ではありません。

実は他のソフトで頻繁に使用されるのがオンザフライ方式のプロキシです。これは特にユーザーがプロキシファイルを指定せずとも自動的にディスクにキャッシュされるタイプのものです。
例えばNukeではプロキシを有効にして解像度を設定するとプレビュー再生と同時に自動的にディスクにキャッシュします。ユーザーがプロキシを有効にしていれば、そのフッテージが呼び出されたときには自動的にこの画像キャッシュが表示に用いられます。読み込みの設定などを変えるとプロキシは自動的に削除されて更新されます。AfterEffectsにおけるRAMプレビューに似ています。

これに似た機能はAfterEffectsにも存在していて「環境設定」の「メディア&ディスクキャッシュ」で設定できます。ここではプレビュー(スタンダード) の際にメモリに入り切らなかったデータをディスクキャッシュに入れてレンダリングを行ない、一度レンダリングした状態にしてからRAMに移します。複雑なコンポジションなどでプレビューを実行するとタイムライン上の緑のバーが青くなることあります。それがディスクにキャッシュされている状態です。

細かく書き始めるとまたこれだけで終っちゃうので公式のヘルプを参照してください。

AfterEffectsユーザーガイド

しかしながらこのディスクキャッシュはあくまでRAMキャッシュの補助ということで、何度も繰り返し使用するという性質のものではありません。

上記のユーザーガイドの説明によれば

After Effects ではフッテージレベルおよびレイヤーレベルでキャッシュが行われるため、より高速なプレビューが可能です。変更されたレイヤーはプレビュー中にレンダリングされ、変更されていないレイヤーはキャッシュから表示されます。

と書かれています。Nukeでも変更が加えられるとキャッシュは無効になります。文面だけ読むと一見NukeやShake、Compositeと同様のキャッシュ機能を有してるように思えます。
ところがAfter Effectsではコンポジション内の各レイヤーに従属する形でエフェクトが追加されます。例えばあるレイヤーに「ブラー」「レベル補正」「シャープ」の3つが適用されていた場合は、このうちのいずれかを変更しても「レイヤー」のキャッシュは無効になってしまい、これらのエフェクトが再度計算されます。またエフェクトだけなく、トランスフォームといった情報もレイヤーに含まれているためにサイズや位置の変更もレイヤー全体への変更となります。

とにかくAfterEffectsの場合、これらキャッシュが非常に脆弱な仕様となっているので、いざ使いたい局面でキャッシュが有効にならないということが多く、これらを解消するためにはプロキシを作成する必要があります。

AppleInsiderに掲載されていたCS6の情報によると、ディスクキャッシュの問題はAfter Effects CS6で一部改善されそうです。


5. プロキシファイル作成時の注意
プロキシを作成する理由というのは「処理や読み込みを軽くする」というものですが、データサイズが小さいということが、AfterEffectsへの負荷を減らすということと同義にはなりません。例えばAfterEffects内部で1920x1080 32bpcの処理を行なうためのメモリはどのようなフォーマットを用いても同じです。ファイルによって圧縮がかかっていても、AfterEffectsではそれを内部で伸張して使用します。よってこの伸張にかかる処理の負荷が大きければ、いくらファイルのデータ容量が小さくても処理にかかる時間や負荷は増大します。

例えばPNGフォーマットは、展開に結構負荷がかかります。また量子化されたデータ(MPEGなど)もデコード処理に時間がかかります。(MPEGフォーマットなどではAfterEffectsはメディアキャッシュを作成して高速にアクセスかつ安全にアクセスできるようにしています)

容量を抑えることに優位性があるとしたら、低速なネットワークドライブ上のデータに直接アクセスして仕事をしなければならないような場合です。ネットワークの転送時間がAfterEffectsでの処理時間を大きく上回るような場合には、圧縮/展開の時間を考慮してもデータ容量を抑えた方がパフォーマンスがあがります。逆に高速なディスク(RAIDやSSD)のあるシステムであれば、転送データ容量よりもAfterEffects内部での負荷を減らした方がパフォーマンスの向上が望める場合があります。いくら高速なディスクであってもメモリ帯域と比較すれば低速ですので、この辺はバランスを見極める必要があるかと思いますが...

プロキシで使用できる色深度、カラースペース、ガンマ値が元のフッテージと同じであるということも重要です。エフェクト処理やカラー補正をかけたときに、大きな違いが生じるようなフォーマットは使用するべきではありません。例えばLogで記録されたDPXファイルのプロキシにOpenEXRを使用する場合、DPX自体が読み込み時の設定でリニアに変換されていないとトラブルの原因になります。AfterEffectsにRAW Logで読み込んでエフェクトでLog->Lin変換を行なっている場合には、変換後のコンポに対してOpenEXRのプロキシを設定すべきです。

またOpenEXRなどのfloatデータを持っているも形式では、必ずしも内部にRGBの画素データばかりとは限りません。座標などが保存されている場合には、値は12.5などをなっていても、画面に表示されるのは白(1.0)となってしまいます。このようなデータを再度AfterEffectsでレンダリングすると(たとえ同じOpenEXRフォーマットでも)、元のデータを保持できなくなる場合があります。Depthなども出力したソフトウェアによって異なる値を格納していますので確認が必要です。(0.0-1.0で格納しているものもあるので必ずしも駄目とは限らない)

以上でAfterEffectsのプロキシについて終わりです。

HS_ProxyManagerでは面倒なプロキシのレンダリング手順を自動化、また複数の解像度のプロキシを作成してそれらを切り替えて使用できますので、もしよかったら試してみてください。(まだ開発途上なので色々問題もありますが...)


[関連記事]
HS_ProxyManager 0.9 Beta1
AfterEffectsのプロキシについて Part.1
AfterEffects 2.5D Relighting Demo