へきらくおきらく

Unreal EngineやSingle Board Computerでのゲーム開発メモ

Tinyなパッケージに挑戦してみよう

Unreal Engine 4 (UE4) その2 Advent Calendar 2020
23日目です。

UE4で100MB未満のWindowsパッケージを作ろうという記事です。

UE4.26.0をベースに書いています。また、エディタの画像は言語が英語です。

f:id:wakanya:20201222215111p:plain

 

何回もプロジェクトのパッケージを行っている方には見慣れた内容かと思います。

目次:

1. なぜ100MBなのか

制限プレイが好きだからです

Epic Games主催のゲームジャム(直近は:2020 Epic MegaJam)において、

「パッケージサイズが100MB未満のゲーム」とうModifierカテゴリが設けられています。

例えば、2019 Epic MegaJamのThe Tiny Awardを受賞したタイトルはこちらです。

The Cat-Earth Society

 

設けられるカテゴリの種類は毎回同じではありませんが、

TINY AWARDについては常設されているように見えます。

その他XRゲームや、Houdiniを活用したModifierカテゴリが最近の流行りのようです。

 

今回はこのTiny Award向けとして活用できるように、

基礎編はBlankプロジェクトを100MB未満に小さくするパッケージング設定。

応用編はコンテンツ追加をしながら100MB未満キープするためのTipsを紹介します。 

 

ゲーム制作はいつでも制限がつきものです。

提示された制限内でコンテンツを制作できます。と言えることは素敵なことで、

制限に挑戦することは価値ある経験だと思います。  制限プレイは楽しい

 

軽量化するための全ての手段を紹介するという趣旨ではありません。

主観ですが、触りやすい部分を挙げてみようと思います。

「こういう方法もあるよ!」という知見や魔術をお持ちの方は、

ぜひブログなどで共有していただけたらと思います。

1.1. UE4で100MBのパッケージってどんな感覚?

試しに簡単なプロジェクトのパッケージサイズを確認します。

↓ ① Third PersonテンプレートをStarterContent無しで作成しました(UE4.26.0)。
  ② Packaging で Shipping(出荷用) 設定にだけしておきます。
  ③ パッケージングを実行してみます。今回はWindows(64bit)向けパッケージを作成。
  ④ できました。サイズを確認しましょう。

f:id:wakanya:20201218090119p:plain

「グレイマンしか居ませんが242MB?、100MB未満のゲームは魔法でも使っている・・・?(2019の受賞作品マジやばくね?)」

自分も最初は簡単には無理なのではと思いましたが、

以下の内容を見てしまえば収めることは容易です。

※今回はディスク上のサイズではなく、上のサイズの値で話を進めることにします。

2. 基礎編:スタートラインに立つための設定

パッケージング時の設定や、使用しないものを削ぎ落とすことで

エンジン側に手を入れることなく100MB未満にすることができます。

 

まず、プロジェクトが空の状態で色々変えてみましょう。

↓ Blankプロジェクト(4.26.0)を新規作成し、Shippingにした状態は、

 およそ203MBでした。

f:id:wakanya:20201218090247p:plain

基礎編ではこのサイズ(203MB)を基準に、効果の高い設定を順番に紹介します。

組み合わせによっては不要となる設定もありますので、

手元で取捨選択を色々試すことが良い100MB未満プロジェクトに繋がると思います。

2.1. 圧縮コンテンツの使用

↓ Project Setting > Packagingより、
 「Create compressed cooked packages」をTrue

f:id:wakanya:20201218090333p:plain

 

↓ 203MB ⇒ 157MBになりました。

f:id:wakanya:20201218090346p:plain

2.2. prerequisites installerを含めない

再配布可のwindowsコンポーネントなどを含めるかどうかについて、オフにすることができます。通常のゲームにおいてはオンにしておくのが親切かと思いますが、

今回のように100MB以下のゲームを好んで実行するようなユーザには既に不要とも考えられますので、除外してみましょう。

(※itch.ioなどに投稿する場合は、含めたバージョンと含めないバージョンを作成して、両方アップロードするとより親切です。)

↓ Project Setting > Packagingより、
 「Prerequisites > include prerequisites installer」をfalse。

f:id:wakanya:20201218234054p:plain

 

↓ 203MB ⇒ 164MBになりました。

f:id:wakanya:20201218234103p:plain

2.3. 32bitパッケージの利用

Windows向けのパッケージングについて、32bit版のほうが容量が小さくなります。

UE4.26はデフォルトで32bitパッケージが無効になっており、64bitしか選択できませんので、32bitパッケージを有効にする設定を紹介します。

 

UE4.26のパッケージ選択肢です。デフォルトでは32bitがありません。

f:id:wakanya:20201218090457p:plain

 

では、有効にします。

↓ Configフォルダの中から、「DefaultEngine.ini」を開きます。

f:id:wakanya:20201218090524p:plain

 

↓ DefaultEngine.iniに以下の文を記述し保存します。適用はプロジェクトを再起動します。

[/Script/WindowsTargetPlatform.WindowsTargetSettings]

bTarget32Bit=true

 

↓ 末尾にでも追加しましょう。保存を忘れずに。

f:id:wakanya:20201218090543p:plain

↓ プロジェクトを再起動すると、32bitのビルド選択肢のみ出現します。

f:id:wakanya:20201218090559p:plain

↓ 203MB ⇒ 169MBになりました。

f:id:wakanya:20201218090617p:plain

2.3.1. 補足:32bitなぜデフォルトで選べなくなった? 

 

表題から逸れるので折りたたみました

UE4.25リリースノートにあるように、
 ロード時間改善機能(10-20%の改善って凄まじい)を追加した結果、
 Win64とWin32環境でデータの互換性が失われてしまったためです。
 さらに32bitアプリは非推奨として進める方針であることも記述されています。
Cooked Data Compatibility
Unreal Engine 4.25 includes some major serialization changes to improve load times. A side effect of these changes is that cooked data is no longer compatible between Win32 and Win64 executables. Projects will need to cook two sets of data to support both build types. However, 64bit Windows will still run Win32 executables so shipping only a Win32 version could be an option for some projects that wish to support 32 bit Windows.

Load Time Improvements
Depending on the platform, users may experience a 10-20% load time improvement because of UObject optimizations, general rendering and physics optimizations, and low overhead serialization for materials and shaders.

Win32 Support
We are officially deprecating our Win32 support. It will be included in Unreal Engine 4.25 and Unreal Engine 4.26, but support for 32-bit Windows operating systems will be removed in a future release.

またUE4.26リリースノートでは、
 64bitか32bitどちらかしか選べないようにしました。と記述されています。
New: Changed the File|Package menu for Windows to only show 32 or 64-bit options, based on the bTarget32Bit Windows project setting. It now won't cook with Win64 but run with Win32.

2.3.2. さらに補足:設定方法の調べ方

なんとUnreal Engine 4のソースは無料!それっぽいワードで追っていけばいずれ辿り着けます。

↓ 「\Engine\Config\Windows\DataDrivenPlatformInfo.ini」にFreezing_b32Bitという項目があって、
 「bTarget32Bit」という変数らしきものが怪しい!

f:id:wakanya:20201218091958p:plain


↓ 「Engine\Config\BaseEngine.ini」ベースの設定ファイルで無効になっているから、
 プロジェクトでもそのまま無効になっているということなんだね!

f:id:wakanya:20201218092008p:plain

補足おわり

 

2.4. エディタのコンテンツを除外

↓ Project Setting > Packagingより、

 「Exclude editor content when cooking」をTrue

f:id:wakanya:20201218092033p:plain

 

↓ 203MB ⇒ 199MBになりました。

f:id:wakanya:20201218092045p:plain

 

2.5. 使用しないPluginの無効化

↓ 基礎編の設定を全て適用するとギリギリ100MBに収まります(UE4.26.0)が、

 これではコンテンツが入りません。

f:id:wakanya:20201219003826p:plain

この項ではこのサイズ(99.9MB)を基準とします。

 

ゲームで使用しないプラグインなどを外します。

ゲームで使用するか否かはゲームの企画によって選択する必要があり、

ここでは判断するための手法を紹介します。

 

サイズが大きいプラグインはどれでしょうか?

↓ 調査のため、「UsePak File」をOFFにしてパッケージングしてみます。

 度々確認するため別のフォルダにとっておくのをおすすめします。

f:id:wakanya:20201219004649p:plain

↓ ①パッケージングされたフォルダ内のEngine側Pluginsフォルダ以下について、

 ②「.u」などで検索し、サイズ順に並べます。

f:id:wakanya:20201219005136p:plain

SpeedTreeImporter内のコンテンツが大きいので、外してみましょう。

↓ Edit > PluginsからPluginマネージャを開きます。

f:id:wakanya:20201219005332p:plain

 

↓ Allの部分を選択し、右上の検索窓に入力して「SpeedTree Importer」を探します。

 EnabledをOFFにしましょう。

f:id:wakanya:20201219005547p:plain

 

↓ 「UsePak File」の設定をTrueに戻してパッケージング。

 99.9MB ⇒ 96.3MBに減らせました。

f:id:wakanya:20201219010204p:plain

サイズを抑えるように意識していれば(応用編の内容)、

ここからでもゲームにできます。が、もうちょっと減らしてテクスチャやサウンドコンテンツを入れるための余裕を持ちたいです。

 

↓ 先程の「UsePak File」を外したパッケージについて、

 ①Engineフォルダを開き、

 ②.dllなどで検索し、サイズ順に並べます。

f:id:wakanya:20201219011627p:plain

OVRPlugin:Oculusを使用するVRゲーム向けライブラリのサイズが大きいです。

コンテストにはXRのカテゴリもあるので狙うなら入れておくべきですが、

企画においてVRゲームにならないなら外すことで大きく容量を稼げます。

↓ 「VR」などで検索するとOculusやSteamVRがオンになっているので、外してみます。

f:id:wakanya:20201219012307p:plain

 

↓ SpeedTree、Oculus、SteamVRを外しました。

 99.9MB ⇒ 92.0MB。8MBと、かなり余裕ができました(個人の主観です)。

f:id:wakanya:20201219012811p:plain

さらに使用しないPluginを外していくことでサイズを小さくしていくことができます。例えば追加で「Chaos Niagara」、「Niagara」を外すと90MB未満にすらできます。Niagaraコンテンツを含んでも100MB未満は達成できますので最初から選択肢を狭めなくてよいと思います。むしろ含んで最新機能付き制限プレイをしよう

また、何でもかんでも外してエディタ用のプラグインなども外すと開発し辛くなってしまいますので気をつけてください。「Asset Manager Editor」などは元々パッケージに含まれないので外してもパッケージサイズの削減には効果無い上、Reference Viewerなどが使えなくなってしまいます。

3. 応用編:各種Tips

パッケージサイズが変わりやすい部分について紹介します。

ここの内容を把握できていれば、ゲームコンテンツを追加しても100MBに収めることは苦行ではない思います。

ただし、都度パッケージングしてみてサイズを確認することをおすすめします。

いつのまにか大きいサイズのテクスチャを参照して一気に増えてしまった、ということも度々あるでしょう。

 

圧縮設定についてはランタイムの挙動やコンテンツのクオリティが変化しますので、

変更を加えた後にパッケージングゲームを動かして確認することを徹底しましょう。

3.1. テクスチャの圧縮設定、Mip設定

↓ テクスチャアセットを開くと、サウンド同様にCompression Settingsがあります。

 またDetailsの上部には、Resource SizeとMipmapの数が表示されます。

 Compression SettingsやMipsの設定を変更するとResource Sizeが変わります。

f:id:wakanya:20201220080152p:plain

※Resource Sizeはパッケージ時のサイズではないですが、

 設定による変化の目安に使用できます。

 

↓ Mipmapの設定は直接NoMipmapなどを設定するか、

 Texture Groupから判定されるようになっています。変更した場合にResource Sizeや

 Number of Mipsの値が変わることを確認してください。

f:id:wakanya:20201220080206p:plain

 

↓ 2048*2048のアルファ付きテクスチャ1枚入れたときのパッケージサイズの変化です。

f:id:wakanya:20201220085005p:plain

↑ ロゴや字を綺麗に出すためにUserInterface2Dにした場合などは注意しましょう。

 

テクスチャの設定についてのより詳細な内容はこちら↓をご覧ください。

今回の目的の場合、特にテクスチャを4の倍数サイズにすることが重要です。

そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streamin…

3.2. サウンドコンテンツの圧縮設定

パッケージ時サイズを変更しやすいコンテンツとしてサウンドがあります。

↓ 例えば、約7MBのBGMを用意してみました。

f:id:wakanya:20201219211616p:plain

UE4にインポートするとこのようにSoundWaveコンテンツになります。

f:id:wakanya:20201219211324p:plain

 

↓ ダブルクリックなどで開き、Quality > Compressionという項目に注目します。

 デフォルトが40に設定されていることがわかります。

f:id:wakanya:20201219211825p:plain

↓ Compressionを色々変えてパッケージしたサイズ結果がこちらです。

 元ソースが7MB近くありましたが、デフォルトの状態でも1MBすら増えていません。

f:id:wakanya:20201219211901p:plain

↑ 1と100の設定間で、サイズに1MB以上の違いがあります。

 10MB程度の中でやりくりすることを考えると大きな差です。

 

実際にパッケージされたゲームの音を確認しながら、

サイズが100MBに溢れないよう調節してください。

3.3. パッケージに含める/含めないマップ、フォルダの指定

これは通常のプロダクトでも同じことですが、余計なアセットがパッケージに含まれないように指定すべきです。

公式のドキュメントの一部とほとんど同じことを書きます。見比べてみてください。

パッケージ化したゲームのサイズを小さくする | Unreal Engine Documentation

 

↓ このようなフォルダ構成になっているとします。Debugは含めたくありません。

f:id:wakanya:20201222013748p:plain(Content以下フォルダ1つ、綺麗だと思います)

 

↓ Project Setting > Packagingについて、

 ① 「Cook only maps」をオンにし、指定マップのみパッケージに含みます。

 ② マップは「List of maps to include in a packaged build」に「+」で枠を追加し、

  「...」よりマップを指定します。削除などは「▼」より行います。

 ③ 除外フォルダは「Directories to never cook」に指定します。

  マップと同様に「+」、「...」、「▼」で操作します。

f:id:wakanya:20201222014119p:plain



3.4. MarketPlaceなど外部アセットを使用する場合は必要部分だけMigrate(移行)する

インポートしてきた外部アセットの未使用コンテンツを一つ一つ削除するのは骨が折れる作業です。新規のBlankプロジェクトか、Contentが空のコピープロジェクトを用意して、必要なコンテンツだけ抜き出す手法が効率的です。

※パッケージ設定はConfigフォルダ、Plugin設定は.uprojectファイルに内包されているので、空のプロジェクトにコピーすることをおすすめします。

 

↓ まず外部アセットにどれだけコンテンツが含まれているか見てみます。

 ① 今回は「Lightning_Electricity_Pack」を使用。(おすすめ。ただし要Niagara)

 ② フォルダを右クリックから、「Migrate」(日本語環境:移行)を選択します。

f:id:wakanya:20201222020824p:plain

 

↓ 含まれているコンテンツをさっと見ることができます。

 たくさんリストされています。プロジェクトに必要なものだけ残したいです。

f:id:wakanya:20201222021313g:plain

 

Migrate機能のすごいところは参照関係を辿ってくれるので、

マップに対してMigrateすることで、使用しているコンテンツだけピックアップすることができます。

↓ Cook対象に含むマップについて、右クリックして「Asset Action > Migrate」。

f:id:wakanya:20201222022938p:plain

 

↓ スクロールが必要無いほど数が絞られました。「OK」を押して移行先を選択します。

f:id:wakanya:20201222023233g:plain

 

↓ 移行先プロジェクトの「Content」フォルダを指定してOKしましょう。

f:id:wakanya:20201222023607p:plain

 

3.4.1. MarketPlaceのアセットって高品質だけどサイズが大きいのでは・・・?

「コンテンツを少し追加してはパッケージのサイズを見てみる」を何回か行うと、

意外と数MBの中にも様々なコンテンツを込めていけることがわかります。

MegaJamのようなコンテストにおいては自作のコンテンツの方が評価されますが、

コンテンツの組み合わせ方法については評価されるので、例えばエフェクト、サウンドなど全く無いよりはマケプレアセットだとしてもあった方が良いとなるはずです。

↓ MegaJam2020にて100MB未満に挑戦してみまして、

NiagaraのMarketPlace外部アセット、64bit」でもなんとか収まっています。

 (UE4.24を使用しています)

www.youtube.com

 

↓ 実装するオセロAIが32bitアプリのメモリを食いつぶすんじゃないかと考え、

 64bit版を選択してギリギリサイズになりましたが、

 そこまでの思考は組めませんでした。なら32bitで背景の解像度を上げるべきだった、

 と反省もあります。ぎ、ギリギリが楽しいんだよ

f:id:wakanya:20201222024413p:plain

 

3.5. pak設定を外してコンテンツの大きさを調べる

ゲームコンテンツを追加した状態で100MBを超えてしまった場合、

不要なPluginが残っていないか再び調べるのも有りです。

またゲームコンテンツの何を削減、調整するか、判断材料のためにPlugin選択時と同様にゲームコンテンツの大きさを調べてみましょう。

 

↓ 基礎編のPlugin外と同様に、pak設定を外してパッケージングします。

 ※パッケージングが終わったら設定しなおしましょう。

f:id:wakanya:20201222033157p:plain

 

↓ WindowsNoEditor内のプロジェクト名が付いたフォルダを開きます。

f:id:wakanya:20201222033729p:plain

↓ 「.u」などで検索し、サイズ順でソートしてみましょう。

 (テクスチャやサウンドが上位にくることが多いと思います。)

f:id:wakanya:20201222033810p:plain

4. おわりに

自分がJenkinsマシンにでもなったかのような気分になりました。

ぜひ自身のゲームをパッケージングして、どのくらいのサイズか見てみたり、

コンテンツをサイズ順にソートしてみたりして眺めてみてください。

そしてこの記事を片手にTiny Awardへ挑戦する方が現れるのを期待しています。。

ウチも、やったんだからさ

UE4アドカレその2、明日はmmlさんの記事です。お楽しみに!

その2:Unreal Engine 4 (UE4) その2 Advent Calendar 2020 - Qiita

 

その1:Unreal Engine 4 (UE4) Advent Calendar 2020 - Qiita

その3:Unreal Engine 4 (UE4) その3 Advent Calendar 2020 - Qiita