新ゲームモード『Battle Royale』
Fortnite:Battle Royale では PvP モードが新たに追加されました。PvP モードでは、100 名のプレイヤー達が 5.5 km^2 の広大なプレイ可能に放り込まれ、最後の 1 人になるまで殴り合いを続けます。これらを実現するために、Fortnite 開発チーム挑んだ課題についてお話します。
Battle Royale ゲームモードの開発では、パフォーマンス、メモリ、ワークフローの最適化が行われました。これらは Fortnite:Battle Royale だけでなく、アンリアル エンジン 4 採用のすべての開発、特に同じような要件でビルドするゲームにも活用できます。
これらは はすべて、Perfoce と GitHub の両方で利用可能になっています。今月出荷予定のアンリアル エンジン 4.18 にほとんどが実装され、残りは 4.19 に実装されます。
Dedicated サーバーのパフォーマンス
最初の課題は、100 名のプレイヤーを同時に処理し、それを 20 時間維持し、しかも最小の帯域になるように Dedicated サーバーのパフォーマンスを最適化することでした。
1 フレームごとにプレイヤー付近に存在するすべてのアクタにサーバーからアップデートを送ります。つまり、プレイヤーごとに関連するアクタを判断し、適用した変更を把握し、その変更と一緒にプレイヤーにパケットを送らなければなりません。プレイヤーに最高の体験を提供するためには、送るアップデート量を最低限に抑えて CPU 時間と帯域を最小化する必要があります。
作業のほとんどはゲームコードのプロファイリングと最適化でしたが、エンジンにはまだまだ最適化の必要な場所があることが分かりました。
エンジンに対して行った Dedicated サーバーの最適化は以下の通りです。
- 接続時にクライアントに送らなければならない RPC 数を減らすために RPC にストリーミングするレベルをバッチ処理しました。 (4.19 に実装予定)
- OS ソケット バッファ サイズを設定可能にして、Battle Royale 用に値を上げました。これにより、サーバーの負担過重の原因となる同時接続クライアントによるバッファのオーバーフローを防ぎます。 (4.19 に実装予定)
- キャラクターがコンポーネント上で立ち姿勢ではない (ジャンプする、または転ぶ) 時に、CharacterMovement RPC 分の帯域を減らしました。 (4.19 に実装予定)
- サーバーからアップデートを受け取ることができる1 フレームあたりのプレイヤー数を制限することができます。ロビー画面では 25 人、ゲームプレイ中は 50 までに制限しました。 (4.19 に実装予定)
- クライアントがサーバーへアップデートを送る時のレートを制限します。クライアントが高フレームレートで実行した場合のサーバーの負担過重を防ぎます。 (4.17 で実装済み)
- プレイヤー数が多いとネットワーク渋滞が発生するので、クライアントの ping 回数を他のクライアントへリプリケートしないようにするオプションを追加しました。 (4.19 に実装予定)
- FArchive::SerializeIntPacked におけるレプリケーション時のメモリ割り当てをいくつか削除しました。 CompatibleChecksum の計算方法を変更しました。 (4.19 に実装予定)
- レプリケーション中の速度を向上させるために、プロパティの型の比較を string から FName に変更しました。 (4.19 に実装予定)
- Dedicated サーバーのネットワーク統計をクライアント上でリアルタイム表示する方法を追加したことにより、クラウド サーバーでも簡単に統計が見れるようになりました。 (4.19 に実装予定)
- アビリティ システムに変更を加えて、 より効率的にネットワークの関連性を判定できるようにしました。これにより、アビリティ システムを使用する際のレプリケーションのコストが大幅に削減されます。 (4.19 に実装予定)
詳細マップのビルドとレンダリング
Fortnite:Battle Royale には、5.5km^2 の広大なプレイ可能なエリアが広がります。パラシュートでの降下時に一瞬だけ全体を見る事ができるのですが、広大な視界をそのままゲームプレイ中も持続させようと思いました。そのためには、LOD ソリューションの最適化が必要なことは分かっていました。
これまで、エンジンでは Simplygon 機能に依拠しながら HLOD (Hierarchical LOD 階層的 LOD) 機能が使用されてきました。それによって、マップ内のある領域に置かれているののが単一のローポリ メッシュに統合され、遠景時には 1 回の描画コールで済むようになっていました。これらのツールは以前から存在しており、 Paragon –にも使われていますが、アーティストの効率性を高めるためにさらに改善しました。
アーティスト達が連携して作業しやすいように分割したのですが、HLOD ツールとはしっくりいきませんでした。そこで、ワークフローとうまく噛みあうように HLOD を変更して、アーティストがローカルに HLOD を再ビルドしなくて済むように、一晩で HLOD をマップに再ビルドするコマンドレットを追加しました。 (Will be in 4.19)
4.18 から実装開始
Battle Royale ではビュー ディスタンスとプレイヤー数が拡張されたため、パフォーマンスおよびメモリの改善が必要となりました。特にメモリ関連は重要でした。最適化はゲーム側コンテンツがメインでしたが、エンジン自体にも多数の改善を行いました。
4.18 に実装されるコンソールの改善点は以下の通りです。
- [XboxOne + PS4] ローレベル メモリ トラッキング ツールを改善して、可能性のあるメモリ最適化を特定しやすくしました。
- [XboxOne + PS4] ボリューム テクスチャのアップデート効率を上げることで、 ピーク メモリ使用量 が 240MB 改善されました。
- [XboxOne] 有効にされているレンダリング機能に合わせて GPU 上の帯域使用が最大になるように、様々なレンダー ターゲット レイアウトを追加しました。
- [XboxOne] D3D12 でのディスクリプタ ヒープでメモリ オーバーヘッドが120Mb 改善されました。
- [XboxOne] オンザフライでレンダー ターゲットの割り当てと解放を行うことで、メモリ使用量が 100MB+ 以上 改善されました 。
- [PS4] テクスチャ ストリーミングとデブラグ プールの処理方法を最適化することで 300-400MB 改善されました。
Battle Royale の作業中、特に 30Hz ゲームに影響を及ぼすエンジンへの入力レイテンシーの問題が見つかりました。レイテンシーを 66ms 前後 (削減率は 60Hz のゲームの半分) に下げてスレッドの同期を改善したところ、問題は解決しました。これらの変更により反応性がアップ、そして照準も合わせやすくなり、ゲームの体感が確実に改善されました。(4.19 に実装予定)
今後の改善にもご期待ください!
上記の改善は Fortnite:Battle Royale の初回出荷分に実装されるほんの一部にすぎません。この経験を活かして、非常に詳細なマップの処理に伴うレベル ストリーミング、エディタ パフォーマンス関連の改善を行って、我々のゲーム チームだけでなく、ゲーム業界のユーザーの効率性向上に貢献したいと思います。