2021年7月19日~24日(アメリカ現地時間)に、今年度はオンラインでの開催となった世界最大級のゲーム開発者カンファレンスイベント"ゲーム・デベロッパーズ・カンファレンス 2021"(以下、"GDC 2021")。

 2021年7月21日(日本時間では22日)には、miHoYoの『原神』リードAIプログラマーによるカンファレンス"'GENSHIN IMPACT': BUILDING A SCALABLE AI SYSTEM"が行なわれた。本記事では、その模様についてリポートしていく。

 オープンワールドRPG『原神』は、その広大すぎる世界が話題となっている大作だ。しかもその広大な世界が、スマホ上でもシームレスかつスムーズに表示されていく。素人目線だと、オープンワールドの描画では膨大な負荷が生じそうなものだが、それをどのようなAI技術で制御しているのだろうか。

ph01
カンファレンスに登壇したのは、miHoYoのリードAIプログラマーのシュオ・シュウ氏。
ph02
オープンワールド、かつマルチプラットフォームの広大な世界"ティワット大陸"を舞台に大冒険が繰り広げられる『原神』。今後のアップデートで、さらに複数の国家とそれぞれの広大なエリアがゲーム内に追加されていく予定だ。

ふたつのシステムを軸に形成されたAI群

 今回のカンファレンスでは、

  • AIアーキテクチャの設計やその開発動機
  • ナビメッシュ(ナビゲーション情報を含むメッシュ。これを地形などに活用すると、キャラクターが地形の障害物にぶつからずに移動できる)に関するオープンワールドにおける問題と解決
  • AIパフォーマンスをモバイルも含め最適化するための技術の共有

 という、大まかに3つのテーマが設けられた。

ph03

 まずはAIアーキテクチャについて解説された。『原神』では数多くの民間人NPCが動き回っている都市内を歩き、郊外に出れば野生動物が動き、それらをプレイヤーは狩ることができる。さらに戦闘NPCとも、各ダンジョンやフィールドで遭遇し、襲い掛かられることになる。

 それらを制御するAIの種類は、配信開始の最初期の時点で200以上。この時点で今後のため、ゲームデザイナーがAIを比較的短時間で効率的に作っていくシステムが必要となった。さらにそれらすべてが盛り込まれた結果、システム全体のエントロピーがどうなるかという懸念事項もあった。

ph04
頻繁にアップデートを続けることで、『原神』のAIコンテンツ総量は増加し続けている。

 AIどうしのそれぞれの動作への影響などが問題にならないようにしつつ、NPCの多様性もまた保ちたい。この問題は、AIの動作をカスタマイズするAIフレームワークで解決されている。

 "Behavior Trees"という、大規模なツリー階層となっているAIフレームワークがその基本となる。たとえば、敵NPCのサブツリーにはターゲット選択ノード、スキル選択ノードなど、ツリーにおける枝葉の先となる細かな"リーフノード"が含まれている。

 そのAIが動きやアニメーションにおいて、どこまで実行されるのか。その判断場面が増加し続けており、追加のパフォーマンスが必要となっていく。そうなると、モバイルデバイスではコンピューテイング能力が少ないこともあり、重要ではない部分はどこなのか判断するせめぎ合いが発生する。

ph05

 開発者たちはAI意思決定パイプラインを構築するため、まずは決定プロセスを再編成した。

 まず最初に、ターゲットの選択やリアクションの決定など、主要なAIのロジックをグループ化する。それらを"Decision Tree"(決定ツリー)という、軽量で決定分岐のみが含まれるツリーに移行させる。これでアクションなどが決定し、実際に行なわれるスキルの詠唱や移動などの内容が決定。最後に、それがアニメーションシステムのパラメーターに送信され、適切なアニメーションが再生される。

ph06
この一連の流れが、左から右へと一方向でシンプルに実行される。

 このワークフローを"カプセル化"し、各機能モジュールごとに別々に組み合わせることで、いっしょにAIの原型データを形成できる。こうしたビックデータ的な方法には利点もあるが、それぞれのAIがほかのAIに影響を与えることを気にせず形成が進んでしまう欠点もある。

 そこで『原神』では、NPCのAIロジックに独自の特徴を持たせた。

 たとえば本作の狼のボスには、独自の戦闘ステージが用意される可能性があり、それに伴う特定のスキル使用条件が発生する可能性もある。さらに第1段階では攻撃パターンが少なく、第2段階になることで新たなスキルを使用するようになる。
 この仕様を実現するために、新たに"Key State Manager"を準備した。

ph07

 上画像のスライドに表示されているのは、火のスライムのキーステートマネージャーだ。この図のステート(四角で囲まれた各項目)がそのNPCが各状況で行なえる戦闘行動を表しており、プログラムとAIはこのステート情報を参考に、つぎの行動やスキル使用などを決定するための情報を習得する。

 このステート構造と、さきに紹介した左から右へ流れるパイプラインを組み合わせることで、『原神』のための最終的なAIフレームワークが形作られている。

一時メモリと、クラウドを使い分けて世界を描く

 続いては、『原神』のオープンワールドについての解説がされた。アドベンチャーゲームとしてスムーズさを提供しつつ、途切れない継続的なゲーム体験を保つのがまずは基本。そのうえで、広大なマップのためにワールドをナビゲートしていくAIを構築するという、大きな挑戦となった。

ph08
最初のリリース時点で、ワールドの広さはほぼ70平方キロメートル相当。とてつもなく広大だ。

 広大なワールドでは、その地形情報をサポートする"NavMesh(ナビメッシュ)"も広大となる。キャラクターの付近で生成されたポリゴン地形の表面にあるナビメッシュが、各NPCが目標地点に移動するのをサポートしているわけだ。

ph09
この写真一枚が表しているのは、『原神』における1平方キロメートルの範囲のみだ。全世界を覆うナビメッシュの広大さは、推して知るべし。

 広大な世界のサイズに対する問題以外にも、ナビメッシュには別の問題も発生する。『原神』の複雑な市街を見れば分かる通り、空中回廊を通り、建物のあいだを渡り歩くと、その道幅は2~3メートル前後。その狭い範囲内でも、ナビメッシュの精度を維持しなくてはならない。

 ある程度の精度に達すると、ナビメッシュのポリゴンには亀裂が生じてしまう。そのため、目標地点に向かって歩く市民などのNPCが、不必要に長いルートで移動する事態が発生したりもする。

 その問題に対処するため、『原神』スタッフは数回実験し、ベイクパラメーターを設定した。128のタイルサイズに、ボクセルサイズ0.125m。さらに全体の合計サイズが約6GBに収まるという、『原神』全体のオープンワールドを考慮したナビメッシュが用意された。

ph10

 6GBのデータ量というのは、スマホなどのモバイルで純粋なナビメッシュに用いるためにかろうじて受け入れられる量だ。ほかのプラットフォームでのゲーム容量は昨今ではふつう128GB程度、モバイルの場合は10GB程度。この差をフォローするために、サーバー側へのパスファインディングシステムが考案された。

ph11

 クライアントのキャラクター側で、AIがパスファインディングを作成。現在地などの情報をサーバーに送り、応答を待つ。それを元にエージェントAIが、サーバー側から送られてきたパスフォローアクションを実施する。

 全プレイヤーが同じオープンワールドマップデータを共有しているため、必要になるナビメッシュデータはクラウドに保存されている中のひとつのみ。この段階で、問題は解決しているかのようにも思える。

 しかし『原神』のフィールドには、"ダイナミックシーンオブジェクト"が存在する。一部のスキルなどの効果で上に乘れる台座のようなオブジェクトを発生させるなど、地面の形状を変化させる状況が発生しうるのだ。

ph12

 こういった動的な障害物を処理するには、パスファインディングサーバーで特定のチャンク(塊)を割り当てる。その塊が、その場にいる各プレイヤーのローカルに同期される。塊が置かれるたびに、サーバーはパスフォロー情報を再構築するのだ。

 影響を受けるナビメッシュはその部分のみなので、クラウドからのデータ全部を建て直すわけではない。そのため、一時的にサーバー上に別のメモリが作成されることになる。

ph13
この過程については、例を挙げて解説された。まずはこのように、各プレイヤー共通のナビメッシュによる地形描画がある。
ph14
そこにプレイヤーが、動的な障害物を設置。グレーの範囲内が、サーバーがそのオブジェクトにより影響を受けると判断する範囲となる。
ph15
その結果、範囲内のパスファインディングに関する問い合わせがサーバーに送られ、範囲内のプレイヤーのみのナビメッシュデータに一時的に反映される。

 サーバー上では定期的にこうしたオブジェクトの存在を確認しており、消滅とともに地形タイルは元の形に戻される。

 このように、各プレイヤーのクライアント側で処理する一時的な地形データと、サーバーとのパスファインディングによる広大な世界の地形の読み込みという形式を同時に取ることで、ナビメッシュ関連のコストを削除することができたのだ。

ph16
6.7GBのランタイムメモリが必要になる場合、パスファインディングを使用するように設定した。この使い分けが、スムーズな地形の構築をサポートしている。

AI側からも十分にできる、モバイルへの負担軽減

 続いてのカンファレンス第3のテーマは、モバイルでのパフォーマンスに関する内容となった。

ph17
こちらがスタッフ間で設定された、モバイルに対するパフォーマンス基準だ。

 60FPSをターゲットとする場合、30体までのNPCを同時にシミュレートし、それらは2~3ミリ秒でフレームごとに対応させる。モバイルでのこの処理目標達成を妨げるボトルネックはCPU側にあったが、GPUともどもテストを行ない、AIロジックのシュミレーションコスト削減のための試みがされた。

 まず、各AIの重要性について、LOD(Level of Detail:詳細レベル表現。特定の集計データを分布図に収束し、より分かりやすくする手法)を定義する。

 そしてプレイヤーとの距離を含め、それが戦闘に関わっているかなどのいくつかの要因から、そのAIの重要性のレベルを"AI LOD"として、"LOD0"、"LOD1"、"LOD2"の三段階(0が最重要となり、2が一番重要性が低い)で導きだす。

ph18
ph19

 上画像の青色のリング内、プレイヤー周辺に見えているNPCの場合、範囲内に関わるAIはLOD1となり、その外に関わるAIはLOD2となる。画像ではLOD0の範囲表示がないが、この街にいるNPCはプレイヤーキャラクターにとってそれほど重要な存在ではなく、また戦闘中ではないためだ。

ph20

 上画像は、非同期状態でのAIモジュールの図だ。つまり各プレイヤーのモバイル上での図解ということになる。AI LODに基づいてAIが分類されており、LODが高いものほどモジュールのコストが高い。

 たとえば、野生動物の集団行動については、AIがまだ戦闘中でない場合、プレイヤー側の環境でそのモジュールを全部負担する必要がない。

 また、LOD2に分類されるAIについては、プレイヤーから見ることができない位置にある以上、アニメーションのメッシュに関しては非表示にできる。

ph21
ph22

 それを踏まえて、改めてさっきの街での表示を見てみる。LOD1の範囲にいるNPCについてもメッシュを一時非表示にしても、実際にはまだ動いている。

 LOD2範囲のNPCについては、そのうちプレイヤーが近付いて表示されるまで、動きは一時停止されている。

ph23

 こうしたコスト削減の方法と併せて、マルチスレッドについても解説された。モバイルでのボトルネックを考えると、データパフォーマンスはできるだけ絞りたいところだ。

 上画像の右図(グラフ)は、メインのスレッドとその下位のスレッドとのあいだでの、データ発送(ディスパッチ)と回収のプロセスを表すもの。こちらが具体的にフレーム単位でタイムライン化されたのが、下の画像だ。

ph24

 膨大なデータ発送のタイミングが見られるが、これらのデータを発生させるAIのタスクについて、すべてが採用されるわけではない。各フレーム単体は各NPCそれぞれのAIを表しており、各NPCが異なる挙動を取るように選択し、計算を割り当てていく。

 これらを総合して最適化を適用した結果、AIに対するパフォーマンス負担はCPUのフレームを0.5ミリ秒にするところまで、なんとか減らすことができた。

ph25

総括:モバイルゲームを最適化するmiHoYoのアイデア

 カンファレンスの最後には、簡単なまとめが行なわれた。

 『原神』のために洗練されたAIパイプラインは、異なるステージをグループ化して定義しつつ、AI決定プロセスの組み合わせを決定するキーステート・マネージャーと協働し、今後のアップデートにおけるスケールアップ、より多くのコンテンツ追加における開発効率も改善してくれた。

 ナビメッシュの問題については、世界全体のダイナミック・マップデータへのアクセスをリモートで確立しつつ、サーバーからのパスファインディングを適宜行なうことで解決することができた。

 そしてカンファレンスの最後には、モバイルゲームのAIがCPUの最適化を助け、モバイルゲームを快適に遊べるパフォーマンスを実現する方法について、『原神』が採用した各方法が紹介された。

ph26

 あの広大な世界とそこに生きるNPCたちを、スマホでもPCやPS4、PS5などの高性能デバイスと遜色なく描写するためには、想像以上の労力が費やされていたようだ。しかし将来の膨大なアップデートを見据えた備えが十分にされていることも、今回のカンファレンスで伝わってきた。

 まだまだ未知なる地域や国が用意されており、冒険の舞台は現状の数倍に広がっていくであろう『原神』。その世界を生かし支えるAI関連の工夫に、我々プレイヤーは今後も感謝を忘れないようにしたいところだ。

※画像は配信をキャプチャーしたものです。

GDC 2021関連記事はこちら