ネットコード — 遅れて届く世界で、ズレをどう隠すか
オンライン対戦では、ズルを防ぐためにサーバーが「正しい世界」を持ち、プレイヤーの手元はその写しを見ています。ところが、手元とサーバーのあいだを情報が行って帰ってくるには、どうしても時間がかかります。この往復時間をRTT(ping)と呼び、ふつうは数十〜数百ミリ秒です。
つまり、あなたの画面はいつも少し過去の世界です。この遅れは消せません。ネットコードの工夫はどれも、「いつの世界の話か」をずらして辻褄を合わせ、ズレを目立たなくするためのものです。代表的な3つを、順番に操作してみてください。
1. Client Prediction — 自分のキャラは、返事を待たずに動かす
いちばん素直な作りは、ボタンを押したら入力をサーバーに送り、サーバーが動かした結果を受け取ってから画面に映すことです。正しいけれど、押してから動くまでに1往復ぶん待たされます。下の図1で「右 ▶」を押し続けてみてください。
Client Prediction は、「サーバーもきっと同じ計算をするはず」と考えて、自分のキャラだけは手元で先に動かしてしまう方法です。送った入力には番号をつけて覚えておき、サーバーから「○番の入力まで反映した位置はここ」と返ってきたら、その位置から、まだ返事の来ていない入力だけを計算し直します(リコンシリエーション)。
ふだんは計算が一致するので何も起きません。でも、自分の知らないうちにほかのプレイヤーが扉を閉めていたら、手元の予測は外れます。図1の「扉イベント」で、予測が外れたキャラがサーバーの位置へ引き戻される様子を見てください。ラグがあるときにキャラがぐいっと戻されるラバーバンドの正体がこれです。
2. Lag Compensation — 撃った人が見ていた過去で判定する
予測できるのは自分の動きだけです。相手の位置はサーバーから届くのを待つしかないので、あなたの画面の敵は片道ぶん過去にいます。しかも撃った弾がサーバーに届くまで、さらに片道かかります。図2で、画面の敵をクリックして撃ってみてください。
Lag Compensation では、サーバーが全員の過去の位置を少しのあいだ覚えておきます。弾が届いたら「この人の画面は○ミリ秒前の世界だった」と計算し、その時刻まで敵を巻き戻して当たりを調べます。おかげで自分の画面で当たっていれば当たる。
ただし、つけはどこかに回ります。撃たれた側の画面では、もう物陰に隠れたあとなのに撃たれる。「隠れたのに撃たれた」という理不尽は、たいていこの補正の副作用です。どこまで巻き戻すかに上限を設けるのは、そのためです。
3. Rollback — 相手の入力を予想して進め、外れたら巻き戻す
格闘ゲームでは、1フレーム(1/60秒)の違いで技が当たるかどうかが変わります。2台の手元でまったく同じ試合を進める必要があるので、昔は相手の入力が届くまで待つ(遅延方式)のがふつうでした。図3では、届くまでの遅れをフレーム数で選べます(見やすいように、1フレームを0.1秒にしてスロー再生しています)。
遅延方式は、自分の入力も相手に届くのと同じだけ先に予約して、両方そろったフレームだけを進めます。ズレは起きませんが、押してから技が出るまでが遅くなり、回線が悪いと操作感がもっさりします。
ロールバックは、自分の入力は押したフレームですぐ反映し、まだ届かない相手の入力は「さっきと同じ(たいていは何もしない)」と予想して進めます。予想はほとんど当たりますが、外れていたとわかったら、そのフレームの状態まで巻き戻し、正しい入力で今のフレームまで一気に計算し直します。画面の相手は技の出だしが飛んで見えますが、自分の操作は一切遅れません。数フレーム分を1フレームの中で計算し直せるほど、ゲームの処理が軽く決定的(同じ入力なら必ず同じ結果)であることが前提です。
- RTT(ping)
- 手元とサーバーのあいだを、データが行って帰ってくるまでの時間。片道はその約半分。
- Client Prediction
- 自分の入力の結果を、サーバーの返事を待たずに手元で先に計算して表示すること。
- リコンシリエーション
- サーバーから届いた正しい位置を起点に、まだ返事の来ていない入力を計算し直して予測を直すこと。
- Lag Compensation
- サーバーが過去の位置を覚えておき、撃った人の画面の時刻まで巻き戻して当たりを判定すること。
- ロールバック
- 相手の入力を予想して進め、外れたら過去のフレームに戻って正しい入力で計算し直す方式。
まとめ
オンラインゲームでは、誰の画面もいつも少し過去で、その遅れは消せません。Client Predictionは自分の動きを先取りし、Lag Compensationはサーバーが撃った人の時刻までさかのぼり、ロールバックは相手の入力を予想して進め、外れたらやり直します。どれも、「いつの世界で判断するか」をずらして、遅れを感じさせないための工夫です。そのぶん、引き戻しや「隠れたのに撃たれた」のような小さな理不尽がどこかに残ります。