2XKOのオンラインプレイを支える技術

2XKOのオンラインプレイをオフラインと同じくらい公平で、遅延なく、楽しくする技術を紹介します。

皆さん、こんにちは!2XKOのシニアプリンシパルソフトウェアエンジニアのTony Cannonです。今回の投稿では、可能な限りベストなオンラインプレイ体験を構築するために、私たちが舞台裏で用いる技術についてお話しします。

さまざまな技術についてお話しするので、以下に概要をまとめておきます。

  • 安定して、可能な限りラグのないオンラインプレイの実現に真剣に取り組みます。これを実現するために、クライアントサーバーアーキテクチャやロールバックネットコード、私たちが「フェアプレイ」モードと呼ぶものなど、さまざまなシステムを利用します。
  • チート対策に真剣に取り組みます。Riot Vanguardを利用し、あなたが常にスクリプトではなく、実際の人間と対戦できるようにします。
  • 対戦以外のシステムを機能させるために、複数の新たなツールを活用します。
    • Game Validation Serverと名付けた仕組みを利用して、クラウドであらゆる試合のコピーを実行し、チート対策やスキル評価、観戦機能を強化します。
    • マッチメイキングが他のロビーでも対戦を探すようになるので、ロビーに人が少なかったとしても、すぐに対戦相手が見つかるようになります。

概要は以上です。それでは詳しく見ていきましょう。

オンラインを最優先に設計

2XKOは当初からオンラインプレイに主眼を置いて開発を行ってきました。本作の核となる技術を構築する際に私たちが最優先としたのが、GGPOの統合と、すべてのプレイテストをオンライン上に移行することでした。本作がまだピアツーピアで実行されていた段階でも、私たちはライアットのラスベガスのデータセンターにパケットプロキシを構築して実行し、日々のすべてのプレイテストを実際のインターネット上で実施していました。これを設計段階で実行しておくことはとても重要です。各キャラクターの技、コンボ、アニメーション、エフェクトをオンライン先行で開発してテストしていれば、オンラインでもオフラインと同じプレイ感覚を実現できるからです。

クライアントサーバーアーキテクチャ

開発が進むにつれて、私たちはピアツーピアからクライアントサーバーアーキテクチャに移行しました。これは、4人対戦を可能にするためのニーズと、安定したパフォーマンスとスケーラビリティというニーズに後押しされたものでした。4人対戦のゲームでは、ピアツーピアのトポロジーと比較して、各プレイヤーがクライアントサーバーのトラフィックの約3分の1の送受信を行います。これによって帯域要件が緩和されて、パケットロスの発生率が低下し、安定しない接続でもスムーズなパフォーマンスの実現に役立ちます。クライアントサーバーアーキテクチャを利用すべき理由は他にも数多く存在します。

プライバシー&IPアドレス保護

何よりも重要なのは、クライアントサーバーアーキテクチャを利用することで、決してあなたのIPアドレスをゲーム内の他のプレイヤーに見せずに済むことです。IPアドレスの露出は、ピアツーピアの主要な障害のひとつです。他のプレイヤーと対戦するだけで、あなたのネットワークがパケット詰まりを起こし、回線が切断されて敗北することになる上、プレイヤーのIPアドレスが露出すればDOS攻撃を受ける危険性もあります。私たちはプレイヤーの安全性に真剣に取り組んでおり、IPアドレスを保護するための最善の方法はクライアントサーバーへの移行でした。 

タイム&入力の優先権限

サーバーはシステム内で他にも重要な役割を果たしており、サーバーが入力情報、対戦の状態、タイムの優先権限を持ちます。開発者として、ロールバックが機能するようになったら、ネットコードの品質に影響する最大の要因は、“リフト”(rift、裂け目)のバランスを取るアルゴリズムの堅牢性です。これはプレイヤーに確実にロールバックの負荷を共有させることを意味します。私のロールバックが3フレームなら、あなたもそうあるべきです。私のロールバックが5フレームなのに、あなたのロールバックが1フレームだけなら、それはリフトのバランスが取れていないからでしょう。 

あまり複雑にならないように説明すると、「リフトのバランスを取る」とは、対戦中のすべてのプレイヤーのゲームクロックを同期させるという意味です。これはピアツーピアの2人対戦の試合の時点で、すでに難しい問題です。どうすれば両方のプレイヤーが同じ情報でプレイできるようになるのか?(オタクの早口:これは実はビザンチン将軍(二人の将軍)問題に関係する命題で、恐らく解決不可能です。が、脱線はここまでにして…)4人対戦ゲームでは、さらに問題が悪化します! 

これがサーバーにタイムの優先権限を持たせる意義となります。対戦中のすべてのプレイヤーのクロックのトラッキング権限をサーバーに集約させることで、すべてのプレイヤーに公平にリフトのバランスを取ることが可能になります。

「フェアプレイ」モード

私たちは2XKOのオンライン体験を改善するために、「フェアプレイ」モードと呼ぶ新たな機能の開発に取り組んでいます。Wi-Fiやスマホのテザリングを利用するプレイヤーや、最小スペックに満たないPCでプレイしているプレイヤーと対戦した苦い経験は誰にでもあるでしょう。その場合、何が起きるのでしょう?ゲームがフリーズしたり、カクついたりして、最悪の場合は特大のロールバックが発生して、キャラクターがテレポートし始めます。ピアツーピアのゲームでは、文字どおり、これが限界です。対戦中のすべてのプレイヤーの入力情報をタイムリーに取得できないなら、たとえロールバックを利用しても、どうしようもありません。これは特に、悪意を持ったプレイヤーがいた場合に問題となります。悪意のあるプレイヤーは、コントローラーにラグスイッチを追加して好きなときにパケットロスを発生させたり、PCでWindowsのタイトルバーをクリックしてゲームを停止させたりします。どちらの場合も、あなたが大幅なラグを体験することになり、重要な場面でコンボをミスすることになります。 

「フェアプレイ」モードが有効になっていれば、2XKOのゲームサーバーが、各プレイヤーの入力が到着するまでに短い猶予期間を設けます。遅れた場合は、そのプレイヤーの最後の入力を再現して、ゲームが進行します。これには大きな恩恵があります。これによって、相手がネットワークにどのような細工をしようとも、あなたのゲームプレイ体験が影響を受けなくなります。相手がラグスイッチを押したり、Wi-Fiの信号を失ったとしても、あなたは気付きすらしないでしょう。ただし、これは諸刃の剣です。あなたのネットワーク接続に数秒間不具合が発生すると、予期せず、相手チームから特大のコンボを食らうかもしれません。

フェアプレイは現在テスト中で、正しく調整するには時間がかかります。故意のパケットロスで優位を得ようとするチーターには罰を与えるべきですが、間違って適切にプレイしている他のプレイヤーにトラブルを引き起したくはありません。これについては実装が完了した際に改めてお伝えして、皆さんからプレイ感などのフィードバックを得るようにします。

グローバルなインフラストラクチャー&保護

もちろん、これらのネットワークの改善も、それを支えるグローバルな土台がなければ意味がありません。そこで、これらすべてを上手く機能させるために、ライアットのネットワークインフラを最大限に活用するつもりです。2XKOのネットワークトラフィックはRiot Directのバックボーンを利用して、パケットがインターネットの遅延よりも速くサーバーに届くようにします。サーバー自体はGeneralized DDoS Serviceによって保護されているので、悪意のあるプレイヤーが、あなたのプライベートロビーでホストされる大会の決勝でサーバーを落としてしまうことはできないでしょう。私たちはライアットのGame Provisional Platformを利用して、サーバーを世界中に展開し、本作がリリースされる地域のすべてのプレイヤーで低Pingの対戦を実現するつもりです。世界中のすべてのプレイヤーの近くにサーバーを配置するという高い目標を掲げていますが、それを実現するには少し時間がかかるかもしれません。それまでの間、お待ちいただけるようにお願いします。

Riot Vanguardによるチート対策

公平なオンライン対戦にはプレイの健全性も不可欠であるために、私たちは強固なネットワークと同じくらい強力なチート対策も用意します。チート対策については、私たちは「Vanguard」を活用して、スクリプトやボットの利用を可能な限り難しくします。Vanguardは非常に効果的で、LoLでボット使用者の数を99%低下させることができました。これは、あなたの対戦相手からボットを排除したり、自動パリィや差し返しスクリプトなどのチートを利用するプレイヤーをを排除するために大いに役に立ちます。とはいえ、競技の健全性の維持は一度解決すればそれで終わりではなく、継続的な取り組みです。今後も注視を続けて、必要に応じてアプローチを適応させていきます。

固定入力遅延&フレームペーシング

また、入力遅延の標準化とフレームペーシングのサブシステムにより、オンラインかオフラインか、またはPCかコンソールかの違いにかかわらず、2XKOのプレイ感を一定化させます。 

固定入力遅延

1つ目に利用されるテクニックは、あらゆる入力に3フレームの固定入力遅延を追加することです。これはロールバックのフレームを最小化するために、格闘ゲームで一般的に利用されているテクニックです。2XKOでは、オンラインとオフラインの両方に、この遅延を追加します。そのため、オフラインのトレーニングで体で覚えたコンボのタイミングを、オンラインでもそのまま適用できます。私たちは何年も前に3フレームの入力遅延の採用を決定していました。差し返しのタイミングからゲーム内で最速の技まで、すべてがあらゆる入力に3フレームの遅延があると仮定して開発とテストが行われているので、遅延があったとしても、優れたプレイ感を維持できます。 

フレームペーシング

2つ目のテクニックはフレームペーシングへの大幅な投資です。フレームペーシングとは、ひとつのフレームをシミュレーションしてレンダリングして表示するまでの速さと一貫性のことです。フレームペーシングが安定していないと、画像のカクつきが多発したり、1フレームの目押しを完璧なタイミングで行ったはずなのに決まらない状況が発生します。私たちは入力遅延の最小化と、コンソールとPCの差の最小化の両方を対象として、フレームペーシングに取り組んでいます。現時点では、あなたがボタンを押してから、その結果が画面に表示されるまでの時間は、PC、PS5、Xboxでほぼ同一です。また、これによって2XKOは、オフラインでもオンラインでも、自宅のPCでもオフライン大会のコンソールでも、どこでプレイしてもプレイ感覚が同じになるはずです。

対戦検証サーバー(GVS)

ゲームサーバーが対戦の状態の管理で優先権限を持つことにはすでに触れた通りですが、その意義について詳しく説明します。主なメリットはチート対策とスマーフ対策です。2XKOではコンペティティブのあらゆる対戦で、その対戦のコピーがサーバーで実行されます。つまり、2v2の対戦なら、その対戦の5つ目のコピーがクラウドでリアルタイムで実行されることになります。私たちはこれをGame Validation Server(GVS、対戦検証サーバー)と呼んでいます。 

これを実施するメリットは非常に大きなものです。まず最初に、サーバーを用意することで、誰かがカッとなってLANケーブルを引き抜いた際に、誰にペナルティーを与えるべきかを正しく特定できます。GVSがあれば、プレイヤーの一歩先を行くことができます。ひとりのプレイヤーの対戦のコピーが、不正行為が理由で他のプレイヤーの対戦のコピーと違っていた場合は、対戦の状態のチェックサムをGVSと比較することで、そのプレイヤーを特定できます。これによって、対戦の状態を意図的に改ざんすることで引き分けに持ち込む行為を排除できます。 

また、GVSは対戦の結果をダウンストリームのデータパイプラインにフィードします。例えば、あらゆる対戦の詳細な統計データをライアットの集約型ランキングサービスにフィードできます。ランキングサービスが対戦終了時の統計データをMicrosoftのTrue Skill 2アルゴリズムを通してフィードすることで、わずか数回の対戦でプレイヤーのスキルレーティングを効果的に絞り込むことができます。これによって、スキルの差が開いた一方的な対戦を経験する回数が低下し、スマーフアカウントの利用が劇的に低下すると期待しています。

ロビー&観戦

本作は核となるゲームプレイだけでなく、対戦以外のシステムにも多くの労力を注いでおり、その際たるものがロビーシステムです。格闘ゲームは、自宅で友達と集まってプレイしたり、大会や週末のオフ会で、会場に集まってプレイすることが醍醐味のひとつです。2XKOのロビーは、そのようなソーシャルな交流をオンライン上で再現するものです。

進行中の対戦

私のお気に入りの機能のひとつは、進行中のあらゆる対戦を観戦できることです。オフラインプレイの最大の恩恵は、他のプレイヤーの対戦を見れることです。これは自分がプレイするキャラクターの新たなテクニックを学ぶ良い方法であり、他のプレイヤーがどんなツールを使っているのか見ることができたり、単に友達とおしゃべりしたり、大会で自分が負けた相手を応援することもできます。私たちは、この素晴らしい空間を、ぜひともオンラインで再現したいと思っていました。

2XKOのロビーでは、対戦が進行中のキャビネット(筐体)の近くに行くと、そのプレイヤーの頭上に画面がポップアップで表示されて、ほんの数秒で、その対戦をほぼリアルタイムで観戦することができます。チャンピオン選択中でも、対戦が始まったところでも、最終ラウンドの終盤で、勝負が決まる最後の攻撃を決めようとしているところでも、そのプレイヤーが見ている画面を、ほぼリアルタイムであなたも見ることができます。同期に長い時間がかかったり、再生に遅延が発生したりすることもなく、まるであなたが最初からその対戦に接続していたかのように、すぐに対戦の画面を見ることができます。

サーバー側で行われる観戦の仕組み

この観戦システムを機能させるためには、長い時間をかけてテストする必要がありました。2XKOのようにロールバックシステムを利用する格闘ゲームは、完全に決定論的なアルゴリズムで実行されているため、入力情報さえあれば、常に対戦の状態をリプレイできます。なので、誰かがキャビネットに近づいて、ラウンド1から観戦を始めたら、その入力情報を順番にフィードすれば、すべてが問題なく機能します。ただし、対戦がすでに進行していた場合はどうなるのでしょう?その場合でも、それぞれの観戦者にすべての入力情報をフィードして、開始時から現在の状態まで対戦を早送りすることは可能ですが、それでは長い時間がかかってしまいます。2XKOのアルファラボ1以前の初期バージョンのロビーは、まさにこのような仕組みでした。機能はしますが、快適ではありませんした。画面が最新の状態に追いつくまでに5~20秒も待つ必要があると、プレイヤーはその機能を使わなくなってしまいます。

しかし、GVSが有効になったことで、もっとスマートな方法を利用できるようになりました。繰り返しになりますが、GVSは対戦の状態をサーバー上でリアルタイムで検証するシステムです。プレイヤーが対戦の途中から観戦を始めても、すべての入力情報を送信する必要はありません。そうではなく、GVSから対戦の現在の状態のスナップショットを取得して、その時点から入力情報の送信を開始すればいいのです。スナップショットはメモリ効率の高い、システムの決定論的部分のみの状態をセーブしたものです。サイズがたった50 KBなので、一瞬でプレイヤーに送信できます。3分間の入力情報を早送りする代わりに、50 KBのセーブデータを読み込むだけで、プレイヤーはすぐに対戦の最新の状態を見ることができます。少なくとも私にとっては、まるで魔法のように感じます。

この機能は、サーバー側で対戦をシミュレーションしなければ決して実現できませんでした。プロトタイプバージョンの観戦機能では、対戦中の1人目のプレイヤーのスナップショットを取得して観戦者に送信していたことで、さまざまな問題が発生しました。まず最初に、スナップショットの取得と圧縮の処理負荷が比較的に大きかったのです。低スペックのPCでは、誰かが観戦を始めるために、プレイヤーのFPSが低下していました。これは許容できません。「誰かが運悪く観戦を始めたから、ヒット確認ミスが起きた」なんてことになったら、納得できませんよね?さらに、セキュリティーも低下します。バッファオーバーフロー攻撃などを含んだスナップショットを作成されたり、別のプレイヤーのPCに不正アクセスを許すような攻撃経路を、悪意のあるユーザーに提供したくはありません。観戦データのあらゆるソースをサーバー上の信頼できるソースに移すことで、これらすべての問題を回避できます。

ロビーをまたいだマッチメイキング

最後にお話しするのは、ロビーをまたいだマッチメイキングを可能にする、クロスロビーマッチメイキング機能です。2XKOのロビーでは対戦を始める方法が複数用意されています。個々のプレイヤーに直接対戦を申し込むこともできますし、キャビネットに座って誰かが横に座るのを待つこともできますし、古き良きアーケードのように、コインを置いて「次の対戦相手」として順番待ちすることもできますし、マッチメイキング機能を使って対戦相手を見つけることも可能です。 

これはロビーが満員であれば基本的には上手く機能しますが、一部にエッジケースも存在します。ロビー内の他の誰もが対戦を楽しんでいるなか、あなたが一人だけ余ってしまったら? 

アルファラボ1では、ランキングや連勝やその場で直接キャビネットを観戦など、ロビー内で数多くの素晴らしい機能を楽しめましたが、このようなエッジケースで、対戦を始めるまでに時間がかかってしまうデメリットもありました。実際、オンライン対戦を早く始めたいだけのプレイヤーなら、メインメニューに「対戦を見つける」のような機能があった方が、素早く対戦を見つけられるでしょう。なぜなら、現在のロビー内だけでなく、全プレイヤーベースを対象に対戦相手を探すからです。 

クローズドベータではマッチメイキングシステムに変更を行い、現在参加しているロビーだけでなく、すべてのオンラインロビーで対戦を探すようになりました。現在のロビー内で対戦を見つけた場合は、ロビー内のキャビネットで対戦を予約して、そこにプレイヤーを送り込みます。見つかった対戦で、別のロビーにいるプレイヤーと対戦することになった場合も、体験自体はほぼ同じです。各プレイヤーは自分のロビー内にいたままで、キャビネットで対戦が予約され、対戦相手のホログラフが、あなたの横に座ります。対戦が終了すると、どちらのプレイヤーも元のロビーに戻ります。あなたの連勝記録が失われることはありませんので、ご心配なく。 

シャード全体のすべてのロビーのすべてのプレイヤーが、ひとつのクロスロビーマッチメイキングで対戦待ちすることから、ロビー内でも、非ロビーシステムでメインメニューから対戦を見つける場合と同じ早さで対戦を見つけられます。マッチメイキングは一定時間内に最善の対戦を提供するように調整されています。ピークの時間帯でオンラインのプレイヤーが多いなら、数秒待つだけで、公平な対戦が見つかるでしょう。午前3時で、あまり多くのプレイヤーが存在しない場合でも、すぐに対戦を組めるように試みますが、ピークの時間帯に比べれば、スキルの差が大きくなるかもしれません。人が少ない時間帯に対戦待ち時間が長くなってしまうのは、2XKOだけの問題ではありません。プレイヤー人口が少ない時間帯のオンラインゲームのマッチメイキングでは、ごく一般的なことです。対戦を見つけるまでの時間とスキル格差のどちらを優先するかについては調整が可能なので、皆さんが実際に体験してみてどのように感じたのか、ご意見をお聞かせください。アーリーアクセスを通して、これを完璧なバランスに調整していきたいと思っています。

今後について

さまざまな内容に触れた長い記事になりました。ここまで読んでくださってありがとうございます。私たちは、格闘ゲームはオンラインでもオフラインと遜色なく楽しめなくてはならないと信じています。サーバー検証やロールバックの調整、即時リアルタイム観戦からロビーをまたいだマッチメイキングまで、あらゆる機能はオンラインプレイをオフラインと同じくらい公平で、遅延がなく、楽しいものにするためにデザインされています。とはいえ、アーリーアクセスの最中およびそれ以降も調整やテストを行い、皆さんからのフィードバックに注目していきます。ご感想をお聞かせください。また、バグの報告や新機能や改善の提案もお待ちしています。

最後までお読みくださり、ありがとうございました!

Tony Cannon