西川善司のグラフィックスMANIAC

格闘ゲームで話題になるロールバックの仕組みとは?攻撃が当たった次の瞬間、なかったことになる「あの現象」はなぜ起こるのか?

 連載タイトルと内容があまり一致していない感じが色濃いこの連載もついに4回目となった。で、今回も、また、ゲームグラフィックスとはあまり関係のない内容をお届けする。

 連載第1回から第3回まで、ゲームにおけるプレイ操作の入力遅延の話題について取り上げてきた。そして前回は、対戦格闘ゲームのネット対戦にまつわる「都市伝説」に対する考察をお届けした。

 今回はどんな話題をお届けするかというと、格闘ゲームのネット対戦でときどき目にする、「当たったはずの攻撃が次の瞬間になかったことになる」、あの珍現象のメカニズムについて、だ。

対戦格闘ゲームにおいて、1P-2P間で行なわれている通信とは?

 前回、格闘ゲームのネット対戦において、プレイヤー間で一切のグラフィックスの同期をとっていないことについて触れた。なので、直接、今回の本題に移ってしまっても良いのだが、前回から少し間も空いたので、ちょっと復習をしておきたい。

 なお、前半は前回の内容と被る部分があることはあらかじめお断りしておく。

 さて、「ストリートファイター」シリーズに代表される格闘ゲームはネットワーク対戦ゲームの定番ジャンルだが、こうしたゲームでは、2人のプレイヤーの端末(ゲームを動かしているゲーム機やPC)間において、どのようなデータ通信をしているのだろうか。

 このタイプのゲームでは「ゲーム展開に関わるゲーム要素」は「自分が操作するキャラクター」と「対戦相手が操作するキャラクター」だけだ。

 対戦格闘ゲームではキャラクターをゲームコントローラのレバー操作で動かしたり(場合によっては必殺技コマンドを入力したり)、ボタンを押して攻撃を行なったりするので、そうした操作系のデータが2人の端末間で往来することになる。

 より詳細に言うと、たとえば1P側のゲームコントローラのレバーの入力方向(移動、ジャンプ、しゃがみ、必殺技のコマンド入力)や押したボタンの種類(パンチやキックなど)が、ゲーム内時間とともに対戦相手の2P側の端末へと伝送される。

 これを受け取った2P側の端末は、1P側の操作と照らし合わせて、そのゲーム内時間におけるゲーム処理の結果(攻撃が命中した……など)を確定させる。以降はその繰り返しだ(数)。

ここで言う操作入力とは移動、攻撃、防御といった行動(アクション)のことを指す。なお、格闘ゲームにおけるレバーとボタンの組み合わせによる必殺技コマンド入力の可否判定について一方のプレイヤーのゲーム機側だけで行なうか、それとも双方のゲーム機側で行なうかはゲームの実装の仕方による

 逆に言えば、通信でやりとりされるデータは各プレイヤーの操作情報だけで、それ以外のデータ通信はしていない。対戦格闘ゲームのネット対戦において、一切のグラフィックスやサウンドなどのメディアデータのやりとりはしていないのだ。

 なので、対戦格闘ゲームのネット対戦では非常に軽量なデータ通信しか行なわれていない。多くの対戦格闘ゲームのネット対戦の対戦結果(リプレイデータ)が非常に長くサーバーに保存されているのは、そのデータ量が小さいためだ。

 こうしたリプレイデータはコンパクトなだけではなく、さらに圧縮効率もよい。つまり、データ保存サーバーへのストレージ残量への圧迫が小さいということだ。

 「ストリートファイターV」などの格闘ゲームにおいて、世界中のプレイヤーの膨大なネット対戦のリプレイデータが長期間保存されているのはそうした理由が大きい。

 そして、このリプレイデータは、YouTubeのような映像ストリームデータやMPEGファイルのような動画ファイルではなく、2人のプレイヤーが入力し合ったゲームコントローラの操作が、時間情報とともに記録された「楽譜のようなデータ」のようなものである。

 多くの対戦格闘ゲームでは、“赤の他人”の対戦結果を、自分の端末で再生して見ることができるわけだが、その際は動画として再生しているのではなく、その「楽譜のようなデータ」(リプレイデータ)上の2人のプレイヤーのゲームコントローラの入力データを、その格闘ゲームそのものに入力して、自分の端末上でリアルタイムにプレイを再現していることになる。

 ここまでを踏まえた上で、対戦格闘ゲームに代表される、2人のプレイヤーが競い合う、いわゆるP2P(Peer to Peer)型ネット対戦ゲームがどのようにゲームを進行させているのかを、見ていくことにしたい。

通信対戦型ゲームの基本実装手法「ディレイ方式」とは?

 ゲームの処理系は、基本的には映像の更新頻度、いわゆるフレームレートを基準にした時間進行で行なわれる。たとえば毎秒60コマ、すなわち60fpsのゲームであれば、ゲーム内の時間進行は60分の1秒単位で管理される。そして、この60分の1秒サイクルで前出のフロー図のような処理系が繰り返されることになる。

 なお、余談になるが「映像のフレームレートと非連動にゲーム処理を進行させるゲーム」も実在はする。たとえば、Xbox One向けにリリースされた格闘ゲーム「Killer Instinct」はゲーム映像のフレームレートは60fpsだったが、プレイヤーの入力サイクルは90Hzで実践していた。Xbox 360用レーシングゲーム「FORZA MOTORSPORT2」は映像は60fpsだったが、物理シミュレーションの演算更新頻度は360Hzだった。

 話を戻すと、1台のゲーム機で2人のプレイヤーがプレイする場合は、この処理系は当然その1台のゲーム機内で回ることになる。しかし、これがネット対戦になると「1Pの操作入力」と「2Pの操作入力」が、ネットワーク越しの“個別の2台のゲーム機”で行なわれることになる。

 そう、物理的に異なる2台の別体ゲーム機で動かされたゲーム上で、それぞれのプレイヤーが異なる現実時間のタイミングで操作入力を行なうことになるわけだ。

 2人のゲームプレイを対戦として成り立たせるためには、2人のプレイヤーの操作入力を、互いにやりとりしなければならない。ただ、ゲーム処理系としては、2人のプレイヤーのそれぞれの操作がゲーム内時間のどのタイミングで行なわれたのかを把握する必要がある。

 しかし、各プレイヤーの操作入力情報を各々のタイミングで互いのゲーム機に送り合ったとしても、どの局面のプレイ操作なのか判別できない。

 そこで、各プレイヤーの操作を伝送し合う際には、60分の1秒サイクルで更新されているゲーム内時間情報も付随させることになる。この仕組みにより「両プレイヤーの操作に基づいたゲーム判定の実践」を、2人のプレイヤーのそれぞれのゲーム機で行なえるようになる。

 これが、もっとも基本的なP2P型ネット対戦ゲームの実装形態「ディレイ方式」の処理系概要になる。

 ディレイ方式では、ネットワークに遅延が発生した場合、1P/2Pそれぞれのゲーム機は、相手プレイヤーの操作入力がやってくるまでゲーム内時間を進められない(ゲーム処理サイクルを回せない)ことになる。

 逆に言うと、ゲーム処理サイクルは、その遅延の具合に応じたスピード感となってしまうのだ。具体的には、遅延が小さければゲーム進行はスムーズに回るが、大きければまるでスローモーションのような進行となる……ということだ。

 また、遅延の大小が変動すればゲーム進行はカクついたような感じになってしまう。このあたりが、ディレイ方式の短所ということになるだろうか。

 しかし、この方式は実装自体の難易度は低いこと、同一施設内のLAN回線や、あるいは低遅延が期待できる環境であれば十分に対戦ゲームは成り立つことから、ネット対戦黎明期では採用事例が多かった。

最近、流行のロールバック方式とは?

 そして近年、P2P型ネット対戦ゲームの実装形態として採用事例を増やしているのが「ロールバック方式」だ。

 本連載でもたびたび取り上げている「ストリートファイターV」もそうだし、「GUILTY GEAR -STRIVE-」もそうだ。

 ここ近年になって急激にロールバック方式の採用事例が増えているのは、米Riot GamesのTony Cannon氏がロールバック方式のネットワークミドルウェア「GGPO(Good Game Peace Out)」を2019年に無償利用可のオープンソース公開したことがきっかけとなっている。

 さて、このロールバック方式も、大枠としての基本的な流れはディレイ方式と変わらない。2人のプレイヤーの入力操作情報はゲーム内時間情報を付随させてやりとりする仕組みも同じだ。

 異なるのは、2人のプレイヤーのそれぞれのゲーム処理サイクルに際し、相手プレイヤーの入力操作情報を待たずにゲーム処理の“見切り発車”を許容してしまうところだ。

 たとえ60分の1秒サイクルで進行するゲームであっても、毎サイクル、プレイヤーの操作入力が起きているワケではない。たとえば、対戦格闘ゲームならば、ガード動作は一度行なうと、一定時間、継続ガード状態となる局面は多い。

 あるいはパンチやキックといった攻撃動作においても、技が発動したらすぐに攻撃判定が出るわけではなく、腕や脚を振り上げる始動モーションが行なわれてから技が相手に接触するし、出した攻撃は永遠に出続けているわけではなく、元の基本構え姿勢に腕や脚を戻すまでの技の終了モーションも行なわれる。

 こうした「アクション継続状態」の最中、そのプレイヤーのキャラクタの行動は、対戦相手のゲーム処理側で推測(想定・仮定)が成り立ちやすい。

 ならば、相手プレイヤーの入力操作情報が届いていない状態でも、相手プレイヤーの直前の動作は推測(想定・仮定)ができることになる。

 そう、2人のプレイヤーのそれぞれのゲーム処理サイクルを「両プレイヤーの操作に基づいたゲーム判定の実践」の部分において「仮定のまま」進めてしまうのがロールバック方式の特徴なのである。

 この方式の利点は、各ゲーム内時間ごとの相手プレイヤーの入力操作情報を待たないで済むことから、見かけ上、相手プレイヤーとの通信遅延を隠蔽可能なところだ。

 もちろん、この“見切り発車”した「仮定のゲーム処理」をそのまま進行させてしまっては1P/2Pのゲーム進行が一致せずに進行してしまうこともある。なので、相手プレイヤーの入力操作情報が届いた時点で「仮定のゲーム処理」が正解だったかを確認判定する必要があるのだ。

 もし、その「仮定のゲーム処理」が正解だったらそのまま続行で良いことになるが、間違いだったとしたら“見切り発車”したタイミングから、この不正解判定を下した時点までのゲーム進行を修正しなければならない。そう“ロールバック処理”をしなければならないわけである。

 「ゲーム進行の修正」をするにしても、それぞれのプレイヤーのゲーム機におけるゲーム内時間は“見切り発車”で進んでしまっている。「ビデオ再生の巻き戻し」のような、ゲーム内時間を戻して修正する方策もなくはないが、それは結構なストレスになるので“結果だけ”の修正をするに留めることにしているゲームが多い。

 たとえば、格闘ゲームならば、“見切り発車”による“仮の攻撃成功”で吹っ飛んだ相手が、ロールバック処理によって“攻撃不成立(ガードされた)”となれば、次の瞬間、吹っ飛んだはずの相手が「何事もなかったかのようにガードポーズを取っている」状況になるというイメージだ。

 しばしば、ロールバック処理が働いた際の珍現象を目の当たりにして「AIの予測ゲーム処理が外れた?」というような形容がなされることがあるが、ここまで読んで理解した人であれば、一連の処理に「AIの介在がないこと」「予測や推測がないこと」が分かるはずである。あるのは「見切り発車した仮定のゲーム処理」だけなのである。

 ということで、ロールバック方式では、多少の遅延があってもゲーム進行がスローモーションになりにくく、遊びやすいことが美点ということになる。しかし、遅延の大小は、そのままロールバック処理の大小に比例しがちとなるため、遅延の影響を完全に解消できるわけではない。

 なお、最新のネット対戦ゲームでは、やたらロールバックが起きすぎないように、ロールバック判定頻度を遅延の大小に応じて動的に変更したり、遅延が少ない者同士の対戦では部分的にディレイ方式を許容するような高度なハイブリッドシステムを採用したものも誕生している。


 ということで、今回でひとまず、対戦ゲームにまつわる遅延などの話題についてはひとまず区切りを付けたいと思う。

 ただ、NVIDIAがGeForce RTX 4000系の発表とともにアナウンスしたDLSS3に実装される新機能「補間フレーム生成」機能にまつわる遅延について、筆者はとても気になってきている(笑)。

 このあたりの話題についても、いずれ検証等を行なうかもしれない。それではまた。