文・取材・撮影:イズミロボ・ササ

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

 “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(以下、スイッチ)へ移植するにあたっての課題や解決策などを、大まかに説明した。


【画像56点】「『ドラゴンクエストXI S』はいかにUnreal Engine 4で最適化されたか? “UNREAL FEST EAST 2019”のセッションをお届け」をファミ通.comで読む(※画像などが全てある完全版です)

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


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


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



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

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


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


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


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


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


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

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


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



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


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

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


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


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