『GUILTY GEAR XX ΛCORE PLUS R』にてオンライン対戦の遅延を改善する“期待の技術”テスト開始。ほぼ遅延なしの対戦を実現する「ロールバックネットコード」とは何なのか?

 

アークシステムワークスによる対戦格闘ゲーム『GUILTY GEAR XX ΛCORE PLUS R』(以下、GGXXACPR)のSteam版において、オンライン対戦の遅延を改善する「GGPO」と呼ばれるネットコードが試験的に導入された。このパブリックテストは10月29日から開始されている。また同時期に開催されているSteamのハロウィンセールによって同作は現在80%オフの296円にて購入することが可能だ。

 

GGPOとは一体何なのか?

今回『GGXXACPR』に導入されたGGPOと呼ばれるネットコードはどのようなものなのだろうか。GGPOは、EVOの創設者の一人であるTony Cannon氏が2005年頃から着手し開発している格闘ゲーム用のネットコードで、いわゆる「ロールバックネットコード」と言われるものである。このGGPOは2019年10月からはMITライセンスのもと配布されていて、商用利用が可能であるためアークシステムワークスなども導入に意欲的というわけだ。COVID-19の影響下オンラインでの対戦が主流となったこともあり、ほぼ遅延なしでの対戦を実現できるロールバックネットコードへの注目は非常に高まっている。しかしこのロールバックネットコードというのは一体どういう仕組みで、今までのネットコードと何が違うのだろうか。

ディレイベースネットコードの仕組み

まず大前提として、オンライン対戦をする以上通信遅延を0にすることは物理的に不可能だ。対戦相手の操作情報は、自分の操作よりも遅れて自分の端末に到着する。ネットコードというのはこの操作情報の遅延をどのように取り扱うかの仕組みであり、これがなければ対戦の同期もままならず、自分と対戦相手の画面ではそれぞれ全く違うゲームが展開されることになる。MMORPGのようにサーバーがあるゲームであればサーバーが同期を取ればいいわけだが、この方式はさらに通信遅延が大きくなるため、格闘ゲームのようなジャンルではP2Pという自分と対戦相手を1対1で接続する方式の方がメジャーだ。そしてP2Pにおけるネットコードは、ディレイベースと呼ばれる方式が現在多くのタイトルで採用されている。

ディレイベースネットコードにおいて重要となるのがpingだ。pingとはデータを送って応答が帰ってくるまでの時間を指し、通信相手との物理的な距離に大きく影響を受ける。たとえば通信相手とのpingが60ms(ミリ秒)だとすると、自分から送ったデータが相手に届くまでが大体30ms、相手からの応答が自分に届くまでが大体30msと考えられる。プレイしているゲームが60fpsで動いていると仮定すると、1F(フレーム)は1000/60でおよそ16msである。以上を踏まえると、pingが60msの相手と対戦する時、相手から送られてくる操作の情報は自分の端末に届くまでに30ms、およそ2F(32ms)ほど遅れてくることになる。

このとき画面の帳尻を合わせるためにディレイベースのネットコードがどのような処理を行うかというと、自分の操作にも2F分の意図的な遅延を追加するのである。仮に自分と対戦相手が(同じキャラクターで)1F目に同時にキックボタンを押したとする。ネットコードなしの単純な操作エミュレーションだけが行われる場合、自分のキックモーションは1F目から即座に開始するが、対戦相手のキックは2F分の遅延により3F目から開始するため、自分の画面では一方的に自分のキックが勝つ。もちろん対戦相手の画面では対戦相手のキックが勝っているので、ものの数Fで同期が破綻してしまう。

しかしネットコードが自端末の操作に2F分の遅延を故意に追加する場合、自分のキックも対戦相手のキックも3F目から開始することになり、相討ちとなる。もちろん対戦相手の端末にも2F分の遅延が追加されていて、自分の操作は2F遅れて送られているため、同じ結果となる。このようにしてディレイベースネットコードは、pingに依存する人工的な操作遅延を追加することによって対戦の同期を維持しているわけだ。
 

 
このようなディレイベースネットコードの抱える大きな問題のひとつに、「対戦相手とのpingは常に一定ではない」ということがある。pingが60msで完全に安定しているのであれば、ネットコードも常に2Fの遅延を追加するだけで良い。しかし、現実的な問題として、自分がどのような良好な回線を用意したところで対戦相手の回線や経路にも影響を受けるpingを完全に安定させることは不可能だ。仮に2F遅延環境下での対戦中になんらかの要因でpingが一時的に跳ね、対戦相手の操作情報が自端末に到着するまでに5Fかかったとする。この時、相手の1F目の操作情報が3F目になっても届いていないので、対戦の同期を維持するためにネットコードは3F目から操作情報が到着する6F目までゲームの画面を完全に止めるしかなくなってしまう。いわゆる「ラグ」の正体はこれである。

ディレイベースのもう一つの問題は、操作感が不安定であることだ。pingが多少上下するたびにゲームが止まるのではたまったものではないので、ほとんどのタイトルは通信状況を監視しつつゲーム中に遅延の量を調整している。そしてそもそも最初に仮定した2Fというのも「日本国内同士での対戦」を前提にした平均的な値だ。どのような相手であっても2F遅延で安定しているのであればそれに慣れることもできるが、例えば国内であっても沖縄在住のプレイヤーとの対戦や、海外のプレイヤーとの対戦であればディレイベースでの最低遅延値はどんどん上がっていく。オフラインの0F、オンラインでは1F、2F、3F、4F……ラグと上下する遅延値に都度適応しながらオンライン対戦をするのは、特に競技レベルでゲームをやり込んでいるプレイヤーにとってはフラストレーションの素であるだろう。
 

ロールバックネットコードの仕組み

ディレイベースの仕組みと問題点を認識した上で、あらためてロールバックネットコードがどういうものであるのかを解説したい。先程の「2F遅延環境下で、自分と対戦相手が同じキャラクターで同時に1F目にキックボタンを押した」例を考える。ロールバックではディレイベースと違い自分の操作に遅延は追加されず、1F目から自分のキャラクターのキックモーションが開始される。もちろん同時にキックを押したはずの対戦相手の操作情報はまだ届いておらず、相手のキャラクターのキックモーションも始まっていない。そのままゲームは進み、3F目でようやく「対戦相手は1F目にキックボタンを押した」という情報が自端末に到着する。

この時ロールバックネットコードが何をするのかというと、相手キャラクターのキックモーションの1~2F目をスキップして3F目から再生するのである。当然自分のキャラクターも1F目から開始したキックモーションが3F目の状態なので、相討ちとなる。ロールバックネットコードは、このようにして擬似的に0F遅延環境下でのオンライン対戦を実現するわけだ。
 

https://gfycat.com/redcoordinatedaustraliankestrel

 
そして厳密な話をするのであれば、ロールバックネットコードは本質的には「相手のモーションを途中から再生することで辻褄を合わせる」という仕組みではない。これはあくまでに画面に表示される結果である。前述の例では自端末は3F目に「対戦相手は1F目にキックボタンを押していた」という情報を受け取っている。この時ロールバックネットコードは一旦ゲームを1F目まで巻き戻しており、「入力情報が到着するまでの1~2Fでは棒立ちしていると仮定していた対戦相手が、実際には1F目にキックボタンを入力していた」としてゲームを再シミュレートして、シミュレートした結果の3F目を改めて画面に反映させているのである。

そしてその結果として相手キャラクターはキックモーションが途中から再生されるということになるわけだ。つまりロールバックネットコードは、対戦相手から過去の入力情報が到着するたびにその時点までゲームを巻き戻して再計算し、その結果を現在のゲーム画面に反映させる、という処理を繰り返し行っているのである。これこそがこのネットコードが「ロールバック」と呼ばれている所以である。

ここまで読んでいて気付いた方も多いだろうが、以上の説明には一か所露骨にきな臭い部分がある。「入力情報が到着するまでは棒立ちしていると仮定していた」の部分である。そしてロールバックネットコードのキモはこの部分にある。実際の対戦で「相手からの入力が到着して再計算するまでの間、とりあえず相手キャラを無入力状態の棒立ちにしておくか」というのは不自然である。画面を動かすのに相手の操作情報を待たない代わりに、入力が到着するまでの間は相手キャラクターをそれっぽく動かしておく必要があるというわけだ。そこでロールバックネットコードは現在の相手の状態から未来の入力を予測し、実際の入力が到着するまでの仮の対戦相手を生み出している。相手の操作情報が届きそれが予測された入力と違った場合、あらためてゲームを巻き戻して再計算、現在の画面に反映させるわけだ。

入力予測というと難しい話のように感じられるが、現在実際にロールバックネットコードが導入されているタイトルでは非常にシンプルで共通のアルゴリズムが用いられている。それは「今行っている動作をやり続ける」というものだ。相手がしゃがみガード入力中なのであれば次の2Fもしゃがみガードをし続けていると予測するし、前歩き中なのであれば次の2Fも前歩きをしていると予測する。予測する範囲が未来のたった数Fである以上、これがシンプルに的中率の高い予測なのだ。もちろん相手が実際は前歩き中に途中で前ジャンプをしていた場合は、その操作情報を受け取った瞬間にゲームが再計算され、相手キャラクターの状態が前歩きからジャンプ移行モーションの途中に上書きされる。この予測アルゴリズムは今こそこのようなシンプルなものが利用されているが、タイトルごとに最適化が出来る部分でもあり、今後いくらでも改善が期待できる部分でもある。
 

なぜロールバックは優れているのか

ロールバックネットコードの仕組みを簡単に解説したところで、この方式がディレイベースの前述した大きな2つの問題(pingが跳ねることによるラグと、不安定な操作感)をなぜ解決しているかについて説明する。まずロールバックでは接続が不安定になってもゲーム画面が止まることはない。代わりに何が起こるかと言うと、当然ながら相手キャラクターがテレポートしたりワープしたりする。仮にpingが跳ねて2F遅延だった相手からの操作情報が10F遅延になった時、ロールバックネットコードは相手からの入力が到着するまでゲームを止めるのではなく、上述した予測アルゴリズムに沿って相手キャラクターを仮に動かしている状態を維持する。

もししゃがみガードをしていた相手が、通信が不安定になった瞬間にジャンプをしていた場合、ロールバックネットコードは操作情報を受け取り次第10F前に相手がジャンプ入力をしていたとして巻き戻して再計算する必要がある。結果として自分の画面では相手キャラクターが突然空中にワープしたように見えるだろう。ただしこれは相手がジャンプを入力していた場合だ。相手がこの通信が不安定な10Fの間にネットコードの予測通りずっとしゃがみガードをしていた場合、相手の(10Fしゃがみガードをしていたという)操作情報が届いても再計算の必要はなく、どちらのプレイヤーの画面にも一切変化は生じない。両プレイヤーは、通信が不安定になっていたということに気が付かないままゲームが進行するのだ。ディレイベースではこうはいかず、仮に相手がしゃがみガードをしていただけであったとしても8Fの間ゲームが停止している。

ロールバックネットコードにおいてもpingが跳ねることによる問題は発生しうるが、それは通信が不安定になっている間の対戦相手の操作が画面に変化をもたらす場合に限られている。他の例をあげるならば、例えば対戦相手がモーション合計20Fある大振りの技を空振りしている途中にpingが跳ねたとする。相手の操作情報が10F以上遅れて送られてきたとしても、多くの格闘ゲームにおいて技が空振りしている間はキャンセルも効かずそのモーションが固定されている。この遅れてきた10Fの間で対戦相手がコントローラーを放置していようがボタンを猛連打していようが画面に変化はなく、両プレイヤーとも本来ならばラグっていたことにも気付かないままゲームが進む。このようにロールバックネットコードは、「対戦相手の操作がネットコードの予測と違ってかつその操作が現在の画面に変化をもたらす場合」以外はすべてのラグを(擬似的に)無視することが出来るのだ。

これは第2の問題であるディレイベースにおける操作の不安定さの解決にも繋がっている。ロールバックネットコードでは通信状況が自分の操作に一切の影響を与えない。フレームビタ目押しのコンボ中に通信が不安定になったとしても、その間はネットコードによる操作予測が相手キャラクターを乗っ取るだけであって、自分の操作が抜け落ちたりゲームが止まったりすることはないのである。理論上は常にオフラインを全く同じ操作感でプレイできるわけであるが、実際は現在導入されているロールバックネットコードは最低遅延値を設定するディレイとロールバックのハイブリッド方式が採用されている。

この最低遅延値は1~2Fがメジャーであり、相手との通信状況によって変化せず初期設定値で完全に固定である。この1~2F遅延に慣れてさえしまえば、現状でもあらゆる通信環境の相手と完全に安定した操作感でオンライン対戦することが可能なのだ。もちろん通信が不安定な相手とプレイした場合は相手キャラクターの頻繁なワープに悩まされることになるが、少なくとも自分の操作には影響がない。
 

 

オンライン対戦のこれから

このような理由からロールバックネットコードは格闘ゲームなどのリアルタイム対戦ゲームに非常に適した仕組みだと考えられていて、GGPOのMITライセンス化とCOVID-19の影響もあって急速に注目を集めている。インディーの格闘ゲームなどでは導入されていることも多いものの、メジャータイトルでは技術的な問題もあり普及はまだまだだ。

そもそもロールバックはゲーム状況の巻き戻しと再計算を前提にしている以上、いわゆるエミュレーターのクイックセーブやクイックロードのようにゲーム状況を保存する仕組みが必要であったり、1フレーム内で過去数フレームのシミュレーションを行う以上ゲームエンジンの演算がフレームごとのゲームループから切り離されていたりする必要などがある。こういった技術的な問題に関しては非常にややこしく、また筆者の理解も浅いためここでは割愛するが、とりあえず既存のディレイベースで動く最新タイトルをロールバックへと変更するには多大な労力と困難が伴うということだ。

今回の『GGXXACPR』は古いタイトルであり、PC版移植で最適化が行われていたこともあってGGPOとロールバックネットコードの試験的な導入に適していると判断されたのであろう。セールで300円というその価格の安さも相まって『GGXXACPR』のSteam版同時プレイ人口はここ数日で爆発的に増加しており、9月までの同時接続人数が数十名程度だったのに対し今月にはピーク時2000人を記録している(Steam Chart)。オンライン対戦の快適さについても好意的な意見が多い。こういったテストによって技術的なノウハウが蓄積されれば、既存のタイトルのネットコード変更や、新規タイトルがロールバックネットコードで開発されるといったことも十分にありえるだろう。オンライン対戦の新時代は、すぐそこまで迫ってきている。