2021年7月19日~24日(アメリカ現地時間)に、今年度はオンラインでの開催となった世界最大級のゲーム開発者カンファレンスイベント"ゲーム・デベロッパーズ・カンファレンス 2021"(以下、"GDC 2021")。
2021年7月21日(日本時間では22日)には、miHoYoの『原神』リードAIプログラマーによるカンファレンス"'GENSHIN IMPACT': BUILDING A SCALABLE AI SYSTEM"が行なわれた。本記事では、その模様についてリポートしていく。
オープンワールドRPG『原神』は、その広大すぎる世界が話題となっている大作だ。しかもその広大な世界が、スマホ上でもシームレスかつスムーズに表示されていく。素人目線だと、オープンワールドの描画では膨大な負荷が生じそうなものだが、それをどのようなAI技術で制御しているのだろうか。
ふたつのシステムを軸に形成されたAI群
今回のカンファレンスでは、
- AIアーキテクチャの設計やその開発動機
- ナビメッシュ(ナビゲーション情報を含むメッシュ。これを地形などに活用すると、キャラクターが地形の障害物にぶつからずに移動できる)に関するオープンワールドにおける問題と解決
- AIパフォーマンスをモバイルも含め最適化するための技術の共有
という、大まかに3つのテーマが設けられた。
まずはAIアーキテクチャについて解説された。『原神』では数多くの民間人NPCが動き回っている都市内を歩き、郊外に出れば野生動物が動き、それらをプレイヤーは狩ることができる。さらに戦闘NPCとも、各ダンジョンやフィールドで遭遇し、襲い掛かられることになる。
それらを制御するAIの種類は、配信開始の最初期の時点で200以上。この時点で今後のため、ゲームデザイナーがAIを比較的短時間で効率的に作っていくシステムが必要となった。さらにそれらすべてが盛り込まれた結果、システム全体のエントロピーがどうなるかという懸念事項もあった。
AIどうしのそれぞれの動作への影響などが問題にならないようにしつつ、NPCの多様性もまた保ちたい。この問題は、AIの動作をカスタマイズするAIフレームワークで解決されている。
"Behavior Trees"という、大規模なツリー階層となっているAIフレームワークがその基本となる。たとえば、敵NPCのサブツリーにはターゲット選択ノード、スキル選択ノードなど、ツリーにおける枝葉の先となる細かな"リーフノード"が含まれている。
そのAIが動きやアニメーションにおいて、どこまで実行されるのか。その判断場面が増加し続けており、追加のパフォーマンスが必要となっていく。そうなると、モバイルデバイスではコンピューテイング能力が少ないこともあり、重要ではない部分はどこなのか判断するせめぎ合いが発生する。
開発者たちはAI意思決定パイプラインを構築するため、まずは決定プロセスを再編成した。
まず最初に、ターゲットの選択やリアクションの決定など、主要なAIのロジックをグループ化する。それらを"Decision Tree"(決定ツリー)という、軽量で決定分岐のみが含まれるツリーに移行させる。これでアクションなどが決定し、実際に行なわれるスキルの詠唱や移動などの内容が決定。最後に、それがアニメーションシステムのパラメーターに送信され、適切なアニメーションが再生される。
このワークフローを"カプセル化"し、各機能モジュールごとに別々に組み合わせることで、いっしょにAIの原型データを形成できる。こうしたビックデータ的な方法には利点もあるが、それぞれのAIがほかのAIに影響を与えることを気にせず形成が進んでしまう欠点もある。
そこで『原神』では、NPCのAIロジックに独自の特徴を持たせた。
たとえば本作の狼のボスには、独自の戦闘ステージが用意される可能性があり、それに伴う特定のスキル使用条件が発生する可能性もある。さらに第1段階では攻撃パターンが少なく、第2段階になることで新たなスキルを使用するようになる。
この仕様を実現するために、新たに"Key State Manager"を準備した。
上画像のスライドに表示されているのは、火のスライムのキーステートマネージャーだ。この図のステート(四角で囲まれた各項目)がそのNPCが各状況で行なえる戦闘行動を表しており、プログラムとAIはこのステート情報を参考に、つぎの行動やスキル使用などを決定するための情報を習得する。
このステート構造と、さきに紹介した左から右へ流れるパイプラインを組み合わせることで、『原神』のための最終的なAIフレームワークが形作られている。
一時メモリと、クラウドを使い分けて世界を描く
続いては、『原神』のオープンワールドについての解説がされた。アドベンチャーゲームとしてスムーズさを提供しつつ、途切れない継続的なゲーム体験を保つのがまずは基本。そのうえで、広大なマップのためにワールドをナビゲートしていくAIを構築するという、大きな挑戦となった。
広大なワールドでは、その地形情報をサポートする"NavMesh(ナビメッシュ)"も広大となる。キャラクターの付近で生成されたポリゴン地形の表面にあるナビメッシュが、各NPCが目標地点に移動するのをサポートしているわけだ。
広大な世界のサイズに対する問題以外にも、ナビメッシュには別の問題も発生する。『原神』の複雑な市街を見れば分かる通り、空中回廊を通り、建物のあいだを渡り歩くと、その道幅は2~3メートル前後。その狭い範囲内でも、ナビメッシュの精度を維持しなくてはならない。
ある程度の精度に達すると、ナビメッシュのポリゴンには亀裂が生じてしまう。そのため、目標地点に向かって歩く市民などのNPCが、不必要に長いルートで移動する事態が発生したりもする。
その問題に対処するため、『原神』スタッフは数回実験し、ベイクパラメーターを設定した。128のタイルサイズに、ボクセルサイズ0.125m。さらに全体の合計サイズが約6GBに収まるという、『原神』全体のオープンワールドを考慮したナビメッシュが用意された。
6GBのデータ量というのは、スマホなどのモバイルで純粋なナビメッシュに用いるためにかろうじて受け入れられる量だ。ほかのプラットフォームでのゲーム容量は昨今ではふつう128GB程度、モバイルの場合は10GB程度。この差をフォローするために、サーバー側へのパスファインディングシステムが考案された。
クライアントのキャラクター側で、AIがパスファインディングを作成。現在地などの情報をサーバーに送り、応答を待つ。それを元にエージェントAIが、サーバー側から送られてきたパスフォローアクションを実施する。
全プレイヤーが同じオープンワールドマップデータを共有しているため、必要になるナビメッシュデータはクラウドに保存されている中のひとつのみ。この段階で、問題は解決しているかのようにも思える。
しかし『原神』のフィールドには、"ダイナミックシーンオブジェクト"が存在する。一部のスキルなどの効果で上に乘れる台座のようなオブジェクトを発生させるなど、地面の形状を変化させる状況が発生しうるのだ。
こういった動的な障害物を処理するには、パスファインディングサーバーで特定のチャンク(塊)を割り当てる。その塊が、その場にいる各プレイヤーのローカルに同期される。塊が置かれるたびに、サーバーはパスフォロー情報を再構築するのだ。
影響を受けるナビメッシュはその部分のみなので、クラウドからのデータ全部を建て直すわけではない。そのため、一時的にサーバー上に別のメモリが作成されることになる。
サーバー上では定期的にこうしたオブジェクトの存在を確認しており、消滅とともに地形タイルは元の形に戻される。
このように、各プレイヤーのクライアント側で処理する一時的な地形データと、サーバーとのパスファインディングによる広大な世界の地形の読み込みという形式を同時に取ることで、ナビメッシュ関連のコストを削除することができたのだ。
AI側からも十分にできる、モバイルへの負担軽減
続いてのカンファレンス第3のテーマは、モバイルでのパフォーマンスに関する内容となった。
60FPSをターゲットとする場合、30体までのNPCを同時にシミュレートし、それらは2~3ミリ秒でフレームごとに対応させる。モバイルでのこの処理目標達成を妨げるボトルネックはCPU側にあったが、GPUともどもテストを行ない、AIロジックのシュミレーションコスト削減のための試みがされた。
まず、各AIの重要性について、LOD(Level of Detail:詳細レベル表現。特定の集計データを分布図に収束し、より分かりやすくする手法)を定義する。
そしてプレイヤーとの距離を含め、それが戦闘に関わっているかなどのいくつかの要因から、そのAIの重要性のレベルを"AI LOD"として、"LOD0"、"LOD1"、"LOD2"の三段階(0が最重要となり、2が一番重要性が低い)で導きだす。
上画像の青色のリング内、プレイヤー周辺に見えているNPCの場合、範囲内に関わるAIはLOD1となり、その外に関わるAIはLOD2となる。画像ではLOD0の範囲表示がないが、この街にいるNPCはプレイヤーキャラクターにとってそれほど重要な存在ではなく、また戦闘中ではないためだ。
上画像は、非同期状態でのAIモジュールの図だ。つまり各プレイヤーのモバイル上での図解ということになる。AI LODに基づいてAIが分類されており、LODが高いものほどモジュールのコストが高い。
たとえば、野生動物の集団行動については、AIがまだ戦闘中でない場合、プレイヤー側の環境でそのモジュールを全部負担する必要がない。
また、LOD2に分類されるAIについては、プレイヤーから見ることができない位置にある以上、アニメーションのメッシュに関しては非表示にできる。
それを踏まえて、改めてさっきの街での表示を見てみる。LOD1の範囲にいるNPCについてもメッシュを一時非表示にしても、実際にはまだ動いている。
LOD2範囲のNPCについては、そのうちプレイヤーが近付いて表示されるまで、動きは一時停止されている。
こうしたコスト削減の方法と併せて、マルチスレッドについても解説された。モバイルでのボトルネックを考えると、データパフォーマンスはできるだけ絞りたいところだ。
上画像の右図(グラフ)は、メインのスレッドとその下位のスレッドとのあいだでの、データ発送(ディスパッチ)と回収のプロセスを表すもの。こちらが具体的にフレーム単位でタイムライン化されたのが、下の画像だ。
膨大なデータ発送のタイミングが見られるが、これらのデータを発生させるAIのタスクについて、すべてが採用されるわけではない。各フレーム単体は各NPCそれぞれのAIを表しており、各NPCが異なる挙動を取るように選択し、計算を割り当てていく。
これらを総合して最適化を適用した結果、AIに対するパフォーマンス負担はCPUのフレームを0.5ミリ秒にするところまで、なんとか減らすことができた。
総括:モバイルゲームを最適化するmiHoYoのアイデア
カンファレンスの最後には、簡単なまとめが行なわれた。
『原神』のために洗練されたAIパイプラインは、異なるステージをグループ化して定義しつつ、AI決定プロセスの組み合わせを決定するキーステート・マネージャーと協働し、今後のアップデートにおけるスケールアップ、より多くのコンテンツ追加における開発効率も改善してくれた。
ナビメッシュの問題については、世界全体のダイナミック・マップデータへのアクセスをリモートで確立しつつ、サーバーからのパスファインディングを適宜行なうことで解決することができた。
そしてカンファレンスの最後には、モバイルゲームのAIがCPUの最適化を助け、モバイルゲームを快適に遊べるパフォーマンスを実現する方法について、『原神』が採用した各方法が紹介された。
あの広大な世界とそこに生きるNPCたちを、スマホでもPCやPS4、PS5などの高性能デバイスと遜色なく描写するためには、想像以上の労力が費やされていたようだ。しかし将来の膨大なアップデートを見据えた備えが十分にされていることも、今回のカンファレンスで伝わってきた。
まだまだ未知なる地域や国が用意されており、冒険の舞台は現状の数倍に広がっていくであろう『原神』。その世界を生かし支えるAI関連の工夫に、我々プレイヤーは今後も感謝を忘れないようにしたいところだ。
※画像は配信をキャプチャーしたものです。