Seaside Laboratory

Article

ラグに立ち向かえ!GGPO の低遅延ネットコードの仕掛け

GGPO のロールバック頻度に影響する入力予測がどのような仕組みになっているのか知るために、公式サイトで紹介されている「Fight the Lag! The Trick Behind GGPO's Low Latency Netcode」という記事の一部を興味本位で日本語に翻訳したものです。

英語が得意なわけでもないので間違いもあるかと思いますがご了承ください。

GGPO's Prediction Algorithm (GGPO の予測アルゴリズム)

A good prediction algorithm can minimize the visual glitches that can occur during a rollback. The prediction algorithm's job is to anticipate the player inputs arriving from the network at frame N + (L / F) given the inputs for all previous frames 1...N, where N is the input last received from the remote player, L is the one-way packet transmission time, and F is the frequency at which the game executes its game state.

適切な予測アルゴリズムはロールバック中に発生する画面の乱れを最小限に抑えることができます。予測アルゴリズムの仕事は、以前のすべてのフレーム 1 ~ N までの入力が与えられた時に、フレーム N + (L / F) でネットワークから到着するプレーヤー入力を予測することで、N はリモートプレーヤーから最後に受信した入力、L は一方向のパケット送信時間、F はゲームを実行する頻度です。

The quality of the prediction algorithm is a function of the frequency and severity of the rendering glitches caused by a missed prediction. For example, in a game of PONG, a misprediction will cause the opponent's paddle to jump to a new position on the screen. Getting the paddle position wrong is important, of course, but an algorithm that is always wrong but only off by a few pixels is preferable to one that is only wrong 10% of the time but causes the opponent's paddle to jump by one-quarter of the screen length.

予測アルゴリズムの品質は、予測ミスに起因するレンダリング異常の頻度と厳格さの関数です。例えば PONG というゲームでは、予測ミスにより相手のパドル (ラケット) が画面上の新しい位置にジャンプします。もちろんパドルの位置を間違えることは重大ですが「常に間違っているが数ピクセルだけずれている」アルゴリズムの方が「時間の 10% だけ間違っているが画面の 4 分の 1 の距離をジャンプする」アルゴリズムよりも好ましいです。

Naturally, the best-possible prediction algorithm is game-specific, and probably player-specific as well. GGPO's built-in algorithm is designed to work well with fighting games and beat-'em-ups, though it should work equally well for shooters, maze-solving games (PACMAN, GAUNTLET) and most other arcade games. To date, no developer who has used GGPO has seen the need to implement his own prediction.

当然、最適な予測アルゴリズムはゲーム固有であり、おそらくプレーヤー固有のものです。GGPO の組み込みアルゴリズムは格闘ゲームやベルトアクションゲームでうまく機能するように設計されていますが、シューティングゲーム、迷路型のゲーム (パックマン、ガントレット)、および他のほとんどのアーケードゲームでも同様に機能するはずです。これまでのところ、GGPO を使用した開発者は独自の予測アルゴリズムを実装する必要性を感じていません。

The built-in prediction algorithm assumes future inputs will be identical to the inputs most recently received from the remote player. This caps the number of prediction errors to the number of times the input state changes per interval. While simple, this has proved to work quite well in avoiding the most jarring visual effects. For example, the character moving backward or forward will often cause the screen to scroll left or right. Getting that position wrong will result in the entire screen jumping to the left or right during a rollback. By assuming the joystick remains held in one direction, we ensure that the screen scrolls smoothly in the most common case: running to the right. The worst case (rapidly toggling the joystick from left to right) seldom occurs in actual gameplay.

組み込みの予測アルゴリズムは未来の入力がリモートプレーヤーから最後に受信した入力と同一であると想定しています。これにより予測エラーの数は入力状態が変化する回数に抑えられます。これは単純ですが最も不快な画面効果を回避する上で非常にうまく機能することが確認されています。例えば、キャラクターが前後に移動すると画面が左右にスクロールすることがよくあります。その位置を間違えるとロールバック中に画面全体が左右にジャンプします。ジョイスティックが一方向に保たれたままであると想定することにより、最も一般的なケース (右への移動) では画面がスムーズにスクロールするようにします。最悪のケース (ジョイスティックを左右に素早く傾ける) は実際のゲームプレイでは滅多に発生しません。

Time-permitting, it may be preferable to use the game-state of the previous 1...N frames to provide a better prediction algorithm than the one built into GGPO. For example, in a game of Pong, it might be better to predict that the remote opponent will always move their paddle in a manner to intercept the ball, regardless of their previous inputs. In practice, however, incorporating the possibility of a misprediction into the design of the game to minimize the effect of a rollback has a better payoff, as it's impossible to completely eliminate them. For example, if you have a screen-scroll effect when a player moves on the screen, consider basing it on the average position of the player over several frames or the position of the player K frames ago (where K >= the expected latency in a game), which will minimize (or completely eliminate) the screen-jumping glitch during a rollback. If you have any effects that start on the first frame of execution (e.g. a dramatic screen blackout starting a Super Combo in a fighting game), consider starting the effect on the Kth frame instead of the 0th frame so that the effect is always based on confirmed inputs instead of predicted inputs. Obviously, there is some give-and-take between the responsiveness of the game when played offline and the smoothness when played online using GGPO, but it is an option for designers.

時間が許すのであれば、以前の 1 ~ N フレームのゲーム状態を使用して GGPO に組み込まれているものよりも優れた予測アルゴリズムを提供することをお勧めします。例えば PONG では、以前の入力に関係なくリモートプレーヤーは「常にボールを受け取るためにパドルを移動する」と予測する方が良い場合があります。ただし、実際には予測ミスを完全に排除することが不可能であるため、ロールバックの影響を最小限に抑えるためにゲームデザインに予測ミスの可能性を織り込むことはより良い結果をもたらします。例えばプレーヤーが画面上を移動するときに画面スクロール効果がある場合、数フレームに渡るプレーヤーの平均位置、または K フレーム前のプレーヤーの位置を基準にすることを検討してください (K >= ゲームで予想される遅延)。これによりロールバック中の画面ジャンプが最小限に抑えられます (または完全に無くなります)。最初のフレームで開始するエフェクトがある場合 (例: 格闘ゲームでのスーパーコンボ開始時の暗転)、0 フレーム目ではなく K フレーム目にエフェクトを開始することを検討してください。これによりエフェクトは常に、予測された入力ではなく確認された入力に基づきます。明らかにオフラインでプレイしたときのゲームの応答性と、GGPO を使用してオンラインでプレイしたときの滑らかさの間には多少の妥協がありますが、それはゲームデザイナーにとって選択肢のひとつです。