Back to posts

オンライン対戦は、なぜラグを感じにくいのか

「なぜ最近のゲームはラグを感じずオンライン対戦できるのか」という動画が面白かった。

オンラインゲームでは、自分の操作をサーバーへ送り、処理結果を受け取るまでに必ず時間がかかる。それなのに、最近のゲームではボタンを押した瞬間にキャラクターが動く。

通信が一瞬で終わっているわけではない。実際には、ゲーム側がさまざまな方法で通信の遅延を見えにくくしている。

この記事では、動画をきっかけに、オンライン対戦で使われる予測、補間、ラグ補償について整理する。

サーバーの返事を待っていたら遅い

仮に通信の往復に100ミリ秒かかるとする。

プレイヤーが移動キーを押してから、サーバーへ情報が届き、処理結果が戻ってくるまで待っていると、キャラクターが動き始めるまで約100ミリ秒かかる。

このわずかな時間でも、操作する側には「重い」「反応が遅い」と感じられる。

そこで、多くのオンラインゲームでは、サーバーから返事が来る前にクライアント側で操作結果を先に表示する。

自分の動きを先に予測する

たとえば、右へ移動するキーを押した場合、ゲームはサーバーの確認を待たずにキャラクターを右へ動かす。

同時に入力内容をサーバーへ送り、しばらくして正式な状態を受け取ったら、クライアント側の状態と比較する。

予測が合っていれば、そのまま表示を続ける。違っていれば、サーバーの状態へ修正し、その後の入力をもう一度計算する。

これはクライアントサイド予測(client-side prediction)と呼ばれる仕組みである。

ここでいう「予測」は、プレイヤーが次に何をするかを推測することではない。すでに入力された操作を手元で先に計算し、サーバーでも同じ結果になると仮定することを指す。

Unityの公式ドキュメントでは、クライアントが入力をすぐにシミュレーションし、後からサーバーの状態に合わせて巻き戻しと再計算を行う流れが説明されている。

予測が大きく外れると、キャラクターが急に元の位置へ戻されることがある。オンラインゲームで時々見る「巻き戻されたような動き」は、この修正が目立ってしまった状態だと考えられる。

他のプレイヤーは少し過去を表示する

自分の操作は手元にあるため予測できるが、他のプレイヤーが次に何をするかは分からない。

そこで他のプレイヤーについては、サーバーから届いた複数の位置情報の間を滑らかにつなぐ方法が使われる。これが補間(interpolation)である。

画面には、実際の最新状態より少し過去の状態を表示する。その代わり、通信間隔にばらつきがあっても、他のプレイヤーが飛び飛びに移動しているように見えにくくなる。

つまり、リアルタイムに見えていても、全員がまったく同じ時刻の世界を見ているとは限らない。

サーバーが過去に戻って当たり判定をする

FPSでは、照準を敵に合わせて撃ったのに、サーバー上ではすでに敵が移動していることがある。

現在の位置だけで判定すると、プレイヤーからは明らかに当たって見えた弾が外れてしまう。

そのため、サーバーが過去のゲーム状態を保存しておき、射撃したプレイヤーが見ていた時刻まで一時的に戻して当たり判定をする方法がある。サーバーサイド・リワインド(server-side rewind)やラグ補償(lag compensation)と呼ばれる仕組みだ。

ただし、遅延の大きいプレイヤーに合わせて過去へ戻りすぎると、撃たれた側には「壁に隠れた後で倒された」ように見える。

ラグ補償は遅延をなくす技術ではなく、どちらのプレイヤーの見え方を、どの程度まで判定に反映するかという調整でもある。

ゲームによって使う方法は異なる

すべてのオンラインゲームが同じ仕組みを使っているわけではない。

FPSでは、サーバーを正しい状態の基準にしながら、予測や補間、ラグ補償を組み合わせることが多い。

対戦格闘ゲームでは、相手の入力を予測してゲームを先へ進め、予測が外れた場合に過去へ戻って再計算するロールバック方式がよく知られている。

一方で、将棋やカードゲーム、ターン制ゲームのように瞬間的な操作感を求められないゲームでは、複雑な予測処理を使わなくても成立する場合がある。

ゲームのルールによって、許容できる遅延や不自然さが異なるためだ。

遅延が消えたのではなく、見えにくくなっている

オンライン対戦でラグを感じにくいのは、回線が高速になったからだけではない。

  • 自分の操作結果を先に予測する
  • 他のプレイヤーの動きを補間する
  • サーバーの結果と違ったら再計算する
  • 必要に応じて過去の状態で判定する

こうした処理を組み合わせることで、実際には存在する通信遅延を、プレイヤーから見えにくくしている。

ただし、予測が外れれば位置が修正される。補間を使えば表示は少し過去になる。過去へ戻って当たり判定をすれば、撃たれた側に不自然さが発生する。

ラグ対策は、遅延を完全になくす技術ではない。発生する矛盾を、ゲームとして納得しやすい形に配分する技術なのだと思う。

参考