ゲームを作ったり作らなかったり

ゲームを作ったり作らなかったり。作ってる時はUE4/モデリング/レベル・サウンドデザイン等、作ってない時はインディゲーム・SteamやModの話題等。

UE4.27で導入されたOodle Texture Compressionを試してみる

UE4.27がリリースされました。

今回は、新しく導入されたOodle Texture Compressionが気になったので実際にパッケージ化して試してみました。

UE4.27で導入されたOodle Texture Compressionについて

docs.unrealengine.com

こちらのリリースノートによると、

Oodle Data Compression は、Unreal Engine でデフォルトで有効になっており、パッケージ化されたプロジェクトの大幅な圧縮と迅速なロードを実現します。

 との事なので、パッケージに含まれるテクスチャの容量低下とロード時間短縮が期待出来るようです。

その内容については、

Oodle Texture Compression は、ブロック圧縮された BC1-BC7 テクスチャに対して、きわめて迅速で最高品質のエンコーダです。Oodle Texture の Rate Distortion Optimization (RDO) エンコーダは、非 RDO エンコーダと比較して、2 ~ 3 分の 1 とコンパクトで、高いビジュアル品質のエンコーディングを可能にします。

 RDOエンコーダを使用すれば非RDOエンコーダに対してかなりの圧縮効率を得られるようです。

自分はあまり圧縮エンコーダを気にしてこなかったのでRDOエンコーダというものがよくわからず、実際にパッケージ化して試してみます。

Oodle Texture Compressionは Unreal Engine でデフォルトで有効になっており、RDO エンコーディングは [Project Settings (プロジェクト設定)] で有効にできます (RDO エンコーディングはデフォルトではオフになっている)。

 リリースノートではプロジェクト設定からRDOエンコーディングを有効に出来る、とあるのですが見つけられませんでした。

代わりに、BaseEngine.iniに

[TextureFormatOodle]
; bForceRDOOff uses the Oodle non-RDO encoders for BC1-7, high speed and good quality but no size reduction
bForceRDOOff=False

 と記述されていたので、これをプロジェクトのDefaultEngine.iniに記述して実際にパッケージ化を行ってみました。

パッケージ化するプロジェクトの内容

パッケージ化するのは、空のプロジェクトに下記の自作アセットパックを追加したものになります。

www.unrealengine.com

内容物はレベル・スタティックメッシュ・マテリアル・テクスチャのみと非常にシンプルです。

これをそれぞれチャンク分けしてパッケージ化します。

パッケージング設定

まずは共通の設定として、

・Pakファイルを使用
・チャンクを生成
・ファイルあたり1チャンクを強制
・Shippingビルド

と設定し、アセットが種別ごとにチャンク分けされ、重複の無い状態にします。

ここから比較用として、

・従来の圧縮形式

Pakファイルの圧縮形式をNone

・Oodle(非RDO)

Pakファイルの圧縮形式をOodle(Kraken)
bForceRDOOff=True

・Oodle(RDO)

Pakファイルの圧縮形式をOodle(Kraken)
bForceRDOOff=False

と3パターンでそれぞれパッケージ化します。
なお、Oodleの圧縮形式はKraken以外にも指定できるようですが、今回はデフォルトのKrakenのままとしました。

また、チャンクの振り分けは
0=エンジンコンテンツ
1=スタティックメッシュ
2=マテリアル
3=レベル
4=テクスチャ
としました。

結果

パッケージのチャンクごとのpakファイルは以下の通りになりました。

・従来の圧縮形式

f:id:tekktekk:20210821140559p:plain

・Oodle(非RDO)

f:id:tekktekk:20210821140643p:plain

・Oodle(RDO)

f:id:tekktekk:20210821140719p:plain

 なんとテクスチャ以外でも容量が低下していました。(もしかしてNoneだと非圧縮?)

まず1番気になっていた4のテクスチャですが、従来のものとRDOエンコーダで比較すると半分以下まで圧縮されています。
非RDOとRDOの比較では、67.9%まで圧縮されています。およそ3分の1削れています。
1と2のスタティックメッシュ・マテリアルでは差が無い結果となりました。テクスチャではないので当然ですね。
3のレベルで差が出ているのは恐らくライトマップの圧縮の差だと思われます。

UE4.27のデフォルト設定である非RDOでも従来と比べて相当圧縮されているので十分な効果があると見てよさそうです。
エンジンコンテンツのチャンクに至っては3分1以下まで減っているのですが、一体何が起こっているのでしょうか。
Krakenを使用しているのでZlibよりも圧縮効率が高いとしても物凄い差が出ています。

まとめ

Oodleを使用することで、意外にもテクスチャ以外でも大幅な圧縮を期待出来る結果となりました。

RDOエンコーダ使用の有無はテクスチャへの影響のみとなりましたが、全体容量の大部分を占めるテクスチャが3分の1ほど更に減るのは恩恵が大きいと思います。

なお、パッケージングにかかった時間に関してはあまり差がありませんでした。
1分20秒と短い為ほとんど差が出なかった可能性があります。

今回は容量の比較ですが、圧縮後の画質とロード時間も重要な部分なので時間のある時に見てみたいと思います。