ほげたつブログ

プログラムとアニメーションをかじって生きてる

アニメーション圧縮検証(UE4.25 & ACL)

こちらは「Unreal Engine 4 (UE4) Advent Calendar 2020」3日目の記事にしようとして書き始めたものの、実際に検証してみたら書きたかった内容について書く必要が無い事がわかってしまったためにアドカレ記事としてはボツにしたものです。アニメーション圧縮についてはアドカレ2018向けに書いた過去記事があり、こちらはその続編になるので合わせて読んで下さい。

hogetatu.hatenablog.com


Animation Compression Library について

Animation Compression Library (ACL) とは、Nicholas Frechette 氏が開発するオープンソースのアニメーション圧縮ライブラリです。

github.com

ACL は以下のコンセプトで実装が進められています。(上記 README.md 抜粋、意訳)

  • 圧縮によるアーティファクトを最小限にして高い品質を実現
  • サポートされているハードウェアでの高速圧縮展開
  • 小さいメモリフットプリントにより実行時のメモリ使用量は小さく、ディスクやネットワークの使用量を削減

一般的にアニメーション圧縮は圧縮率と品質のトレードオフになるため、過去記事にもあるような様々な圧縮アルゴリズムを試して用途に合ったものを選定する必要があります。リアルタイム性が高いインタラクティブコンテンツでは展開速度も重要になってくるため、一概にこれが正解というアルゴリズムはありません。ただしその中で ACL はどの項目においても優秀であり、細かい設定をしなくても良い結果が出るのでおすすめしています。

作者のツイートにもありますが、FINAL FANTASY VII REMAKE にも採用されています。



ACLUE4 で利用する

UE4.25 からアニメーション圧縮システムについて改修があり、プラグインから圧縮コーデックの追加ができるようになりました。以下は リリースノート からの抜粋です。

新規:アニメーション圧縮の改善 (ベータ)
柔軟性と生産性を高めるためにアニメーション圧縮システムが見直されました。プラグインでアニメーション圧縮スキームと圧縮データ構造を指定できるようになりました。アニメーション シーケンスは、「自動圧縮」をハードコード化するという以前の方法から、アニメーション シーケンスに適用する 1 つ以上のコーデックが含まれている圧縮設定アセットを参照する方法に置き換えられました。アニメーションの圧縮は非同期になり Unreal Editor 内で非ブロッキング操作として実行されるため、圧縮プロセスの実行中も作業を続けることができます。

これにより ACL を利用するための敷居は下がり、現在はマーケットプレイスからダウンロードできるようになっています。このためブループリントオンリーなプロジェクトでも利用が可能です。

www.unrealengine.com

ACL による圧縮結果

前回と同様にいくつかのモーションに対して圧縮を行ってみました。デフォルト圧縮設定である Bitwise Compress Only と ACL の結果を比較してみます。

デフォルト圧縮設定(Bitwise Compress Only)

f:id:hogetatu:20201108234045p:plain

ACL

f:id:hogetatu:20201108234100p:plain

ACL は Compression Level を Highest に設定して最大限圧縮するようにしています。その他のプロパティはデフォルトのままです。全てのモーションにおいて ACL の方がより圧縮され、Compressed Size が小さくなっているのが確認できます。ただし Bitwise Compress Only は過去記事にある通り、削除しても全く影響が無いキーの削除と量子圧縮のみの設定であるため、圧縮率について ACL が勝るのは当然の結果です。

次は圧縮によってどの程度モーションポーズに影響が出ているのかを確認してみます。同じモーションを ACL で圧縮したものと Bitwise Compress Only で圧縮したもので用意し、シーンの同じ座標に配置することで両者のポーズ差分を視覚的に出してみることにしました。Bitwise Compress Only で圧縮したものはわかりやすいように配置時にマテリアルを変えています。

f:id:hogetatu:20201108235702p:plain

f:id:hogetatu:20201108235722p:plain

ACL は Compression Level を最大にしているにも関わらず、Bitwise Compress Only とポーズ差分がほとんど無いことがわかります。シルエットに影響を与えず、圧縮率も高いという理想的な結果です。もちろん複雑なモーションやボーン構成によって差分が大きく出てしまうケースもありますが、ACL は Compression Settings で設定されたエラー閾値を超えると圧縮コーデックを ACL Safe という圧縮率が低いものに切り替えてくれるので安定性も高いという印象です。とりあえず圧縮は全て ACL にして おき、何か問題が出たら Compression Settings でエラー時に切り替わる圧縮コーデックを ACL Safe なり Bitwise Compress Only なりを設定しておくという雑な運用方針でも十分に耐えられると思います。

余談

冒頭の「書きたかった内容について書く必要が無い事がわかってしまった」というのは ACL の圧縮速度(展開速度ではない)についてです。筆者は ACL の検証自体は二年程前に行い、運用に乗せてからは大きなトラブルも無くメンテナンスも不要だったので放っておいたのですが、この二年間で ACL 自体の圧縮速度向上と UE4.25 で対応された非同期圧縮によりかなり使いやすくなっています。二年前の段階では 1 モーションを圧縮するのに 1 分以上もかかり、筆者が泣きながら GThreadPool を使って作業マシンの CPU 使用率を 100% に張り付かせながら 10 秒くらいになるまで高速化対応を行ったのでその話を書こうと思ったのですが、いざ検証時に圧縮設定を行っても作業マシンがブオーンという音を鳴らさずに即終了してしまったので普通の ACL 紹介記事になってしまいました。これが……民主化……!