Share via


ネットワーク その1 レイテンシ

「さて」とセイウチはいった「ネットワークの話をしましょう」

(訳注:元ネタはルイス・キャロルのセイウチと大工から)

ネットワークゲームプログラマーには以下の三つの不死の敵がいます

  • レイテンシ データが相手に届くまでに掛かる遅延時間
  • パケットロス データが相手に届かない現象
  • 帯域 送ることのできるデータ量の上限

以上の三つについて順に話しましょう。

レイテンシは物理的理由によって決まります。SFの世界では何十年もの昔に実現しているのに、物理学者は未だに光速を超える手段を発見していません。ですから、秒速30万キロ/秒を超える速度でデータを送ることができません。これは物理学者のせいです(そんなに難しいことなのか?)

十分に速いだろって?

僕はシアトルに住んでいて、同僚のイーライ(Eli)はニューヨークに住んでいた。その距離はおよそ4,000Km、光の速度で13ミリ秒掛かる。

僕は以前イギリスに住んでいたけど、イギリスからシアトルまでは7,800Km、光の速度で26ミリ秒掛かることになる。

60フレーム/秒のゲームの場合、各フレームは16ミリ秒毎に更新されるので、僕がイギリスの友達と遊んでる場合は2フレーム近い差(ラグ)が生じてしまう。

ちょっと待ってくれ、話はそれだけではないんだ

  • ネットワークデータは真空中を通らない。光の速度といえば普通は真空中での光の速度を言うけど、実際のデータは光ケーブルや銅線ケーブルを通るので6割程度の速度に落ちてしまう
  • ネットワークデータは一本線で繋がっている訳ではない。両サイドにモデムがあり、それぞれ10ミリ秒程度のレイテンシがある。また、友人は私と同じISPやスイッチボード上にいる訳ではないので実際にはルーターを介してデータ送られる。それぞれのルーターでは5~50ミリ秒程のレイテンシがある

最悪ケースは?

  • Xboxのゲームでは最大200ミリ秒(0.2秒)の遅延が合っても動作するよう奨励されている

どうやったら、家で再現できるの?

NetworkSession.SimulateLatency = TimeSpan.FromMilliseconds(200)

どうすればいいの?

  • 0.2秒の遅延があっても問題のないゲームデザインをする。例えばポーカーゲームなんかの場合は0.2秒程度の遅れは無視してもかまわないよね
  • 予測アルゴリズムを使ってラグを隠蔽する。レイテンシがあるお陰でリモートオブジェクトのその瞬間のゲームステートを知ることは不可能。でも0.2秒前の情報、例えば移動速度、加速しているのか、減速しているのか、旋回しているのかという情報を元に0.2秒後の状態を予測することはできる。
    その予測が間違っていた場合でも、予測した座標から実際の座標へスムーズに補間することによってガクガク動くのを防ぐことができる。予測の90%くらいがあっていればラグが気にならなくなるね。
    ラグを完全に消すことは物理学的に不可能なので、あくまで目的はラグが分からないように隠すということ

ここまでがShawn Hargreaves氏の投稿の翻訳です。

ちなみに日本国内の場合は距離的問題は少ないと思います。例えば東京~札幌間の距離は850Kmで3ミリ秒となりますが、記事の中の通り、問題になるのはルーター間でレイテンシが大きな問題となるでしょう。

予測アルゴリズムですが、以下のサンプルが参考になると思います。

http://creators.xna.com/Headlines/developmentaspx/archive/2007/01/01/Network-Prediction-Sample.aspx

追記:

ゲーム中に表示されるPing値と、この記事で言及しているレイテンシとは違うものです。

  • レイテンシは片道時間 A地点からB地点にデータが届くまで掛かる時間
  • Pingは往復時間  A地点からB地点まで、そしてB地点からA地点までデータを送り返すのに掛かる時間

行きと帰りが同じ速度と仮定すると0.2秒というレイテンシは0.4秒のPing値に相当することに注意してください。