オンラインマルチプレイのUnityクライアントの負荷試験環境

はじめに

こんにちは、クラスター株式会社のソフトウェアエンジニアのsotanです。今回はclusterのUnityクライアント開発に使われている負荷試験環境について紹介します。clusterは、バーチャル空間で開催されるイベントに参加したり、クリエイターの方々が制作したワールド(= バーチャル空間)で遊んだりすることができるプラットフォームです。ワールドでは25人(ロビーのみ50人)、イベントでは100人が同時に1つの空間に集まることができます。負荷試験環境「ワールド・イベント会場に多くのユーザーが集まっている状況」を再現して、そのような状況で発生する問題の再現確認・原因調査・改善結果確認などに使われているものです。

アーキテクチャ

一般的には負荷試験用のツール・フレームワークを活用した環境を構築するケースが多いと思いますが、clusterのUnityクライアント開発では、現状、Windows版アプリをAmazon EC2インスタンス上で実行するというシンプルな方式を採用しています。

GitHub Actionsのワークフローによって、Amazon S3に存在するビルドファイルや設定ファイルの確認、新しいジョブの実行準備、EC2フリートの新規作成が実行されます。EC2インスタンスが起動すると、必要なファイルをS3からダウンロードして、clusterアプリを負荷試験モードで起動するスクリプトが自動的に実行されます。

ワークフローの入力パラメーターとして与えられる

  • ワールド・イベント会場に自動入室させるクライアント数
  • 負荷試験の実行時間

によって、EC2インスタンスの数や終了時刻が設定されます。

また、入力パラメーターとして

  • 負荷試験用クライアントとして使われるビルド
  • ワールド・イベント会場のID
  • アバターの種類

なども設定するようになっていて、複数の異なる条件の負荷試験を同時並行で進行することができます。特定の機能・不具合・パフォーマンス問題などに合わせた状況・条件を設定して負荷試験を進行することができます。

負荷試験モード

clusterの開発版ビルドでは負荷試験用クライアントとして動作するモードが有効になっています。通常モードでは、ログイン、アバター選択、ワールド・イベント会場への入室などを行うためには、UIを手動で操作する必要があります。負荷試験モードでは、こういった操作を自動的に実行するようになっています。

「ロビーに50人のユーザーが集まってエモートを繰り返している」という状況設定の負荷試験の様子

オンラインマルチプレイのテストとデバッグの難しさ

オンラインマルチプレイのテストとデバッグは、Unityアプリケーションのテストとデバッグの中でも難易度が高いものの1つだと思います。クライアントやサーバーのロジック以外にも、様々な要素が影響を及ぼすため、問題の再現確認・要因分析・原因特定が難しいです。主に以下のようなものが挙げられます。

  • ユーザー(プレイヤー)の人数
  • ユーザー(プレイヤー)の行動
  • クライアント端末のネットワーク環境・通信状況
  • クライアント端末のスペック
  • コンテンツ(ワールド・イベント会場・アバターなど)

本番環境で実際に起こっていることと全く同じ条件やシナリオを再現することはできませんが、問題に影響していると考えられる要因を整理して、様々な条件設定で検証しながら再現条件や原因を探っていきます。

おわりに

今回はclusterのUnityクライアント開発に使われている負荷試験環境について紹介しました。ユーザーの皆さまがclusterで快適に過ごせるようにするため、品質改善・パフォーマンス改善を支える仕組みとして改良を継続していきたいと思います。