FIG-129

ネットコード — 遅れて届く世界で、ズレをどう隠すか

ゲーム 2026.10.13 公開 読了 約13分

オンライン対戦では、ズルを防ぐためにサーバーが「正しい世界」を持ち、プレイヤーの手元はその写しを見ています。ところが、手元とサーバーのあいだを情報が行って帰ってくるには、どうしても時間がかかります。この往復時間をRTT(ping)と呼び、ふつうは数十〜数百ミリ秒です。

つまり、あなたの画面はいつも少し過去の世界です。この遅れは消せません。ネットコードの工夫はどれも、「いつの世界の話か」をずらして辻褄を合わせ、ズレを目立たなくするためのものです。代表的な3つを、順番に操作してみてください。

1. Client Prediction — 自分のキャラは、返事を待たずに動かす

いちばん素直な作りは、ボタンを押したら入力をサーバーに送り、サーバーが動かした結果を受け取ってから画面に映すことです。正しいけれど、押してから動くまでに1往復ぶん待たされます。下の図1で「右 ▶」を押し続けてみてください。

CLIENT PREDICTION — 入力は回線を下り、結果が上ってくる
あなたの画面 実線 = 画面のキャラ
扉
回線 ● 入力 ↓ ● 結果 ↑
サーバー(正しい世界)
扉
ボタンを押してから、画面のキャラが動き出すまで: —
MODE ①
サーバーの返事を待ってから動く
図1 — 予測なしでは、押してから1往復待って動き出す。Client Prediction では手元で先に動かし、サーバーの返事が来たら答え合わせをする。予測が外れると引き戻される

Client Prediction は、「サーバーもきっと同じ計算をするはず」と考えて、自分のキャラだけは手元で先に動かしてしまう方法です。送った入力には番号をつけて覚えておき、サーバーから「○番の入力まで反映した位置はここ」と返ってきたら、その位置から、まだ返事の来ていない入力だけを計算し直します(リコンシリエーション)。

ふだんは計算が一致するので何も起きません。でも、自分の知らないうちにほかのプレイヤーが扉を閉めていたら、手元の予測は外れます。図1の「扉イベント」で、予測が外れたキャラがサーバーの位置へ引き戻される様子を見てください。ラグがあるときにキャラがぐいっと戻されるラバーバンドの正体がこれです。

2. Lag Compensation — 撃った人が見ていた過去で判定する

予測できるのは自分の動きだけです。相手の位置はサーバーから届くのを待つしかないので、あなたの画面の敵は片道ぶん過去にいます。しかも撃った弾がサーバーに届くまで、さらに片道かかります。図2で、画面の敵をクリックして撃ってみてください。

LAG COMPENSATION — 弾が届いたとき、敵はもうそこにいない
あなたの画面 敵をクリックで撃つ
回線 ● 弾 ↓ ● 判定 ↑
サーバー(正しい世界)
あなたの画面の敵は、サーバーより 100ms 前の位置
MODE ①
サーバーは「今」の位置で当たりを判定する
図2 — 補正なしでは、弾が届いた時点の敵の位置で判定するので、画面で当たっていても外れる。Lag Compensation では、サーバーが敵の過去の位置を覚えておき、撃った人の画面の時刻まで巻き戻して判定する

Lag Compensation では、サーバーが全員の過去の位置を少しのあいだ覚えておきます。弾が届いたら「この人の画面は○ミリ秒前の世界だった」と計算し、その時刻まで敵を巻き戻して当たりを調べます。おかげで自分の画面で当たっていれば当たる。

ただし、つけはどこかに回ります。撃たれた側の画面では、もう物陰に隠れたあとなのに撃たれる。「隠れたのに撃たれた」という理不尽は、たいていこの補正の副作用です。どこまで巻き戻すかに上限を設けるのは、そのためです。

3. Rollback — 相手の入力を予想して進め、外れたら巻き戻す

格闘ゲームでは、1フレーム(1/60秒)の違いで技が当たるかどうかが変わります。2台の手元でまったく同じ試合を進める必要があるので、昔は相手の入力が届くまで待つ(遅延方式)のがふつうでした。図3では、届くまでの遅れをフレーム数で選べます(見やすいように、1フレームを0.1秒にしてスロー再生しています)。

ROLLBACK — 予想で先に進め、外れたら巻き戻して計算し直す
F 0
あなた
相手
あなた
相手
パンチ入力 パンチ中 予想で埋めたフレーム 予約済みの入力 現在のフレーム
MODE ②
相手は「何もしない」と予想して、すぐ進める
図3 — 遅延方式は自分の入力まで数フレーム遅れる。ロールバックは自分の入力をすぐ反映し、相手の入力は予想で埋めて進める。外れていたら、そのフレームまで巻き戻して計算し直す

遅延方式は、自分の入力も相手に届くのと同じだけ先に予約して、両方そろったフレームだけを進めます。ズレは起きませんが、押してから技が出るまでが遅くなり、回線が悪いと操作感がもっさりします。

ロールバックは、自分の入力は押したフレームですぐ反映し、まだ届かない相手の入力は「さっきと同じ(たいていは何もしない)」と予想して進めます。予想はほとんど当たりますが、外れていたとわかったら、そのフレームの状態まで巻き戻し、正しい入力で今のフレームまで一気に計算し直します。画面の相手は技の出だしが飛んで見えますが、自分の操作は一切遅れません。数フレーム分を1フレームの中で計算し直せるほど、ゲームの処理が軽く決定的(同じ入力なら必ず同じ結果)であることが前提です。

用語ミニ辞書
RTT(ping)
手元とサーバーのあいだを、データが行って帰ってくるまでの時間。片道はその約半分。
Client Prediction
自分の入力の結果を、サーバーの返事を待たずに手元で先に計算して表示すること。
リコンシリエーション
サーバーから届いた正しい位置を起点に、まだ返事の来ていない入力を計算し直して予測を直すこと。
Lag Compensation
サーバーが過去の位置を覚えておき、撃った人の画面の時刻まで巻き戻して当たりを判定すること。
ロールバック
相手の入力を予想して進め、外れたら過去のフレームに戻って正しい入力で計算し直す方式。

まとめ

オンラインゲームでは、誰の画面もいつも少し過去で、その遅れは消せません。Client Predictionは自分の動きを先取りし、Lag Compensationはサーバーが撃った人の時刻までさかのぼり、ロールバックは相手の入力を予想して進め、外れたらやり直します。どれも、「いつの世界で判断するか」をずらして、遅れを感じさせないための工夫です。そのぶん、引き戻しや「隠れたのに撃たれた」のような小さな理不尽がどこかに残ります。