移植へ向けてアセットを最適化

 “UNREAL FEST(アンリアルフェスト)”は、エピック ゲームズ ジャパンが主催する、Unreal Engineの公式大型勉強会。Unreal Engine 4が一般公開された2014年から、秋に関東、春に関西で開催されているイベントだ。この秋は2019年10月6日に、“UNREAL FEST EAST 2019”としてパシフィコ横浜で開催され、数々のセッションが行われた。その中から、“ドラゴンクエストXIへの道2019 ~Nintendo Switch編~”のセッションをお届けする。

 同セッションは、Nintendo Switch用ソフト『ドラゴンクエストXI 過ぎ去りし時を求めて S』の制作にあたり、プログラムやグラフィックスで行った最適化事例を紹介するという内容。講演者は、スクウェア・エニックスの紙山満氏、高木和博氏、ルッコスキ・ミハウ氏の3名だ。セッション前半ではまず紙山氏が、プレイステーション4(以下、PS4)からNintendo Switch(以下、スイッチ)へ移植するにあたっての課題や解決策などを、大まかに説明した。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_01
『ドラゴンクエストXI 過ぎ去りし時を求めて S』ではテクニカルディレクターを務めた紙山氏。

 最初に解説されたのは、Unreal Engine 4(以下、UE4)のバージョンについてだ。PS4では4.13がベースだったが、スイッチ用に4.18までバージョンアップ。その際に、PS4版で使っていたミドルウェア類を、スライドのような事情により、いったん外したとのことで、それによりスムーズなバージョンアップが実現したという。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_02
スイッチへの移植に向けてUE4をバージョンアップ。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_03
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_04
ミドルウェアの整理も功を奏したそうだ。

 つぎに紙山氏が挙げたのは、容量という問題。PS4版でのソフト容量が30GBだったのに対し、スイッチの本体保存メモリーは32GB弱。移植による追加要素なども考えると、ほかの保存ソフトを削除したとしても、入るかどうかわからない計算だ。そこで紙山氏が目安にしたのが、いままでのスイッチ版ソフトでもっとも容量が大きかった、『ゼルダの伝説 ブレス オブ ザ ワイルド』の13GB強というデータ。それを目標に、大幅なメモリー縮小を目指したという。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_05
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_06
PS4の半分以下のメモリー縮小に挑んだ。

 手順としては、アセットを調査して、容量が大きいものは違いが極力わからないようにスイッチに最適化する作業を重ねた。対象となったのは、ムービー、メッシュ、モーションなど。いずれもツール変更などの検討を行い、最終的には13.5GBまでの縮小が実現できた。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_07
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_08
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_09
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_10
多くのアセットを最適化して目標を達成。

つぎなる課題はロードタイム短縮

 無事にメモリー縮小に成功したものの、ここで新たな課題が勃発。それは、アセットが小さくなったぶんPS4版よりロード時間が短くなりそうなのに、とくに変わらないという課題だ。紙山氏の説明によると、ロードの内訳はアセットのロード(I/O)とアセットの初期化処理(CPU)があり、スイッチ版では確かにI/Oは減ったがCPUは減らず、結果的にCPUネックという状態になっていたそうだ。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_11
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_12
CPUの処理時間は減らず、それがネックとなる形に。

 アセットの初期化処理の最適化には限界があり、解決法として出された案が、ほかのどこかで高速化できる部分を探すこと。そこで注目されたのが、「UnrealPak使用時のZLIBの展開処理が重い」という点だ。もっと展開処理が速い圧縮アルゴリズムはないかと探したところ、LZ5が速いという話を紙山氏は聞き、調べてみたら、LZ5の展開速度はZLIBの約8倍。圧縮率は4%劣るものの、もろもろの仕様を考慮し、最終的にトレードオフでLZ5を採用することになった。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_13
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_14
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_15
CPU以外に活路を見出そうと、圧縮アルゴリズムに着目。展開速度を優先して、LZ5を採用することに。

 さらに何かできないかと検討して出てきたのは、「暗転シーンなどでは、GPUは何もしてないのでは?」ということ。そこで紙山氏が考えたのは、そこのGPU処理を落として、そのぶんをCPUに回すことができたらというアイデアだった。暗転シーンのプロファイリングデータとともにSDK チームに相談して、安全に使用できるバランス変更機能を作ってもらえたことで、結果的にそれは実現でき、最終的に暗転時間はPS4版より短縮できたという。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_16
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_17
通常プレイ時と暗転ロード時で処理のバランスを変更。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_54
安全にバランスを変更できる機能を用意してもらえたそうだ。

 紙山氏が最後に解説したのは、“ゲーム中の処理速度”についてで、ブループリントの重さが課題としてピックアップされた。ここでは、あくまでワーストケースになるようなC++のコードを用意して、それをLua5.3やブループリントで書き直した際の、処理速度比較をグラフで紹介。ブループリントはC++の1600倍遅いことがデータで示された(もっとも ブループリントのForがじつはマクロというハンデもあったようだが)。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_18
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_19
ゲーム中の処理速度も大きな課題となってくる。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_20
Lua5.3もブループリントも、C++と比べるとはるかに重い。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_55

 ここでブループリントをC++に書き直すという手もあるが、紙山氏が勧めるのはもうひとつの手段“Nativize”で、速度はLua5.3以上を実現。ただ“Nativize”コードの作成や、エディタでの起動ではいくつか注意点があるようで、ナイトリービルドを作成したりプログラマ以外にバイナリを配布するといった 、ある程度規模の大きい開発の場合、使用時にはよく確認してほしいとのことだ。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_21
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_22
C++に近い速度でプループリントを処理できる“Nativize”。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_23
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_24
有効に使用するにはいくつかの注意が必要となる。

4フィールドを4つの対策で最適化

 セッション後半のトップバッターは、テクニカルアーティストの高木氏。ここでは『ドラゴンクエストXI 過ぎ去りし時を求めて S』のスイッチへの移植に関しての、“グラフィックス最適化”についての講演がなされた。内容は大きく分けて、“スイッチ用の「Scalability」設定”と“草・木の最適化 ~4つの対策”のふたつだ。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_25
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_26
グラフィックス最適化に関して、ふたつの項目を解説してくれた高木氏。

 高木氏によれば、スイッチ版の開発に当たって新要素は増えるものの、PS4版をベースにした開発で「なるべくクオリティーは下げたくない」ということが念頭にあったという。まず検討したのが、スイッチ用のScalability(拡張性)設定だ。これはアセットに手を入れず、プラットフォームべつにパフォーマンスを調整する機能。自動露出などの項目べつに、オンオフを設定できる。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_27
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_28
スイッチ用に各種設定を検討していく。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_29
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_30
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_31
細かい設定にも注目して負荷軽減。

 “草・木の最適化 ~4つの対策”の4項目は、“マテリアルの軽量化”、“Foliageのクラスター分割の設定”、“木の表示頂点数の軽減”、“Mask Material only in Early Z-pass”。『ドラゴンクエストXI 過ぎ去りし時を求めて S』では、フィールドに草木が多かったため、その対応には苦労したそうだ。ここでは4項目ごとに、容量軽減の方法が画像とともに紹介された。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_32
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_33
マテリアルは3種類を使い分けて最適化。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_34
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_35
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_36
クラスター分割を見直して、効率的にカリングできるように対応。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_37
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_56
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_38
木々の表示を軽くするテクニックも。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_39
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_40
Maskマテリアルを高速化する設定も。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_41
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_42
最適化の方法については、効果や注意点をよく把握して使っていきたいところ。

最適化の作業は自動化も可能

 ラストに登壇したのは、『ドラゴンクエストXI 過ぎ去りし時を求めて S』のテクニカルアーティスト、ルッコスキ・ミハウ氏。流暢な日本語で、“UE4の最適化作業を自動化しよう”というテーマを語ってくれた。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_43
作業の自動化事例を紹介してくれたミハウ氏。

 ここでミハウ氏が解説したのは、“マテリアルインスタンス最適化”。まずは“マテリアル”と“マテリアルインスタンス”のふたつから成るUE4の仕組みが紹介され、シーソーの左右にそれぞれを配したイラストで、容量のバランスが説明された。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_44
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_45
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_46
マテリアル要素のバランスが崩れることに注意。

 続いて紹介されたのは、自動化の具体的な事例ふたつだ。ひとつは“Python”を実装したケースだが、問題も多くてけっきょくはC++にポート。もうひとつは“Blutility”実装だったが、こちらも最終的には関数をC++でサポートしたうえ、使用できるように構成したとのこと。
 そうした事情を踏まえて、ミハウ氏は最後に3つのパターンを提示。その3つは、“C++=処理億度が速い”、“Blutility=作りやすい”、“Python=便利”というもの。「どれがいいかはケースバイケース」とミハウ氏はコメントし、セッションを締めくくった。

『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_47
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_48
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_49
イラストも交えてコミカルに紹介された事例1。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_50
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_51
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_52
“Blutility”実装にはC++での作業も必要だった。
『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け_53
結論として3つのパターンがアドバイスされた。