Zwiftで地球の裏側とレースができるのってなぜだろう?
世界中から多人数が参加するネットゲームの特徴を考えると、入力(ペダルを踏む)が、ゲーム上で反映されるまで0.3秒〜1秒程度の遅れがあるはずなので、先を見越して早め早めに対応しましょうという話。
先日バーチャルツールドフランスがzwiftを使って行われました。選手はヨーロッパ・オーストラリア・北アメリカ・コロンビア・南アフリカ.....等々正に世界各地に散らばった選手が、zwift上で1つのレースを行いました。バーチャルツールドフランスに限らず、毎日開催されているZwiftレースには各回世界中から、しかも多い時には100人を超える参加者がいます。これってよく考えるとすごい事で、地球の裏側と通信するには、少なからずタイムラグがあるはずですが、それでも問題なくレースが成立している。環境によって遅れがあって困るといった話はあまり聞いた事がありません。
”Zwiftレースは通信タイムラグをどう解決してレース成立させているか?”ちょって調べた範囲ではズバリの情報はありませんでしたが、ネットゲームの情報を元に考えていきたいと思います。
1.ネットワークの遅延って何?
Zwiftのサポートページでインターネット回線速度に関して、以下の記載を見つけました。
ざっと次のような事がかいてあります。
・スピードテストをして、”Ping"を測定してください。
・サーバーはロサンゼルスのサーバーを選択してください。
※Zwiftのサーバーはロサンゼルスにあるようです。
・Ping値が50ms(0.05秒)以上の場合は、ゲームパフォーマンスに影響があるかもしれません。
Ping値とは、一般的にオンラインゲームのタイムラグのことを差します。サーバーからのレスポンススピードのことで、こちらからの呼びかけに対してどのくらいの時間で応答があるか、パケットの往復時間を数値化したものがPing値です。
実際に測定したので、これを例に説明すると、ロサンゼルスにあるサーバーとのPing値は120ms(0.12秒)でした。
日本とロサンゼルスは直線距離で約8700km離れています。この間を海底ケーブルによってインターネットが繋がっているわけですが、このPing値はデータが日本からロサンゼルスまでいってまた日本に戻ってくるまでの時間を表しています。往復1万7400kmが120ms(0.12秒)。どうでしょう?早いと感じますか?
ただし、Zwiftが要求するPing値は50ms(0.05秒)以下です。
そもそも1万7400kmを光が進むのにかかる時間は58ms(0.058秒)です。Zwiftの要求はほとんどの国で物理的に無理なので、Ping値は50ms以上でもゲームに影響することはないと信じたいものです。
ロサンゼルスにサーバーがあるとして、比較的ユーザー数が多い国で最も離れているのは南アフリカになると思います。直線距離は約1万6000km、往復で3万2000kmです。光の速度で107ms(0.107秒)かかります。
日本–ブラジル間(直線距離は約1万8500km)スピードテストを行った結果、Ping値は341ms(0.341秒)でした。南アフリカ-ロサンゼルス間も同程度になると思われます。
2.ネットワークゲームの仕組み
zwiftでレースを成立させる為に、最も需要なのは着順判定だと思います。レース参加者は一つでも上の順位を目指して本気で競っています。例え1cm差でも勝ちは勝ちです。もしこれが正しく判定されずに、画面上で先着していたはずなのに、結果は負けていたというのではガッカリです。
最終スプリント時速60kmで1cm差の場合時間差は0.6ms(0.0006秒)です。
これを時には100人以上が世界中から参加している、しかもネットワーク遅延Ping値も様々な中正しく判定しなくてはなりません。では、どうやって成立せているか?
一般的なネットゲームに関して、参考になる記事を見つけました。少し古いですが、素人にも分かりやすい記事です。
Zwiftはこの記事の最後に書かれている「非同期型/クライアント分散処理型」に該当すると思われます。
”非同期型”というのは、プレーヤーによって見ている映像・状態が必ずしも完全一致しないということです。レースで重要となる、順位は重要なので全てのプレーヤが見ている画面で一致すべきだと思います。一方道路の右側を走っているか、左側を走っているかはさほど重要ではありません。
Zwiftでは、プレーヤーによってみそれぞれの選手が道路の右側にいるのか、左側にいるのか、それとも中央にいるのか見え方が異なります。※同じレースを別々の人が録画した映像を見ると分かります。
大人数が一度にプレイするには送付する情報をできるだけ減らす必要があります。今どの距離にいるかは絶対に必要な情報ですが、右側にいるか左側にいるかはなくても良い情報なので、左右情報は送っていないようです。
また、現在の出力から、勾配・ドラフティングの状態・路面等を加味して、それぞれのユザーのPCで速度・位置は計算することができます。計算結果だけを送ればサーバーの側の負担を減らすことができるのでZwiftはこの方式を採用しているのではないでしょうか。※これがクライアント分散処理型
■レース時に最低限送受信している情報(推測)
・現在位置(何キロ地点にいるか)
・速度
・出力
・ケイデンス(アバター反映用)
・アイテム使用情報
上記情報をそれぞれのプレーヤがサーバーに送付します。
全てのプレーヤーの情報が揃ったところで、サーバーは全員分のデータをまとめて送り返します。受け取ったデータを元に、各PCにがそれぞれに処理して現在のレース状態を展開していると思われます。
3.サーバーまでの距離の違いによるタイムラグをどのように処理しているか?
サーバーまでの距離の影響を考慮しつつ世界中の人が平等にプレイできるようにする為には最も遅いPing値を許容する必要があります。仮に南アフリカ–ロサンゼルスが最も遅いタイムラグPing値1000ms(1秒)あったとします(※ちょっと長いですが、分かりやすくキリの良い1秒で考えます)。ざっくり南アフリカからロサンゼルスにデータを送るのに500ms、ロサンゼルスから南アフリカで500msかかるものとします。
例として、レース開始ジャスト1分後の状態はどのように反映されているか?
結論から言うと1000ms(1秒)前の入力、つまりレース開始59秒時点での入力が反映されます。入力(踏み込んだ力が)ゲーム上に反映されるまでの1秒の遅れがあると言った方が分かりやすいかもしれません。59秒時点で上述した”レース時に最低限送受信している情報”を各プレーヤーはサーバーに送付します。日本ーロサンゼルスの場合は60ms程で到着するはずですが、全てのデータが揃うまでには最も遅い南アフリカに合わせて500msかかります。500msで全プレーヤのデータが揃ったら、その情報を全プレーヤに送り返します。
この時地域によっては、早く届くかもしれませんが、地域差による不公平が出ないように、最も遅い南アフリカの500msに合わせて、500ms後にデータを展開しゲームに反映させます。結果として、レース開始ジャスト1分後の状態はレース開始59秒時点での入力が反映されますが、このように1秒の待ち時間を設ける事で、レース開始ジャスト1分後のレース状態は、全ユーザーで同じ状態を維持することができます。同じ状態とは、通信遅延がほぼないロサンゼルスでプレイしても1秒の待ち時間を設ければ、南アフリカと同じレース状態を再現できます。地域によるレース状態の差がないので、例え0.001秒の差でも、全てのプレイヤーの画面で同じ結果となります。
上記はあくまで私の想像なので、実際にはどうしているか分かりません。平等性よりも、より遅れのない体験をユーザーに提供したいとZwiftが考えているなら、データは届き次第ゲームに展開して、Pingの早い地域は遅れが少なく、Pingの遅い地域は遅れが大きいと差をつけているかもしれません。
しかしながら、遅れの原因はユーザーの環境よりも、サーバーがどこにあるかというZwift側の都合によるものが大きいです。Zwifrはゲームと言えど”競技性”が高いので平等性の方を重視した設定を採用するのではないかと思います。
4.Zwiftの遅延は気がつきにくい?
実際にZwiftレースをしていて遅延を感じるか?微妙にワンテンポ遅れているような気もするし、そうでもないような気もします。
ネットワーク遅延を如何に感じさせないかが、ネットゲーム作りの腕の見せ所ではないかと思います。
Zwiftで結果に影響する入力は、ペダルを踏んだW(ワット数)だけです。格闘のネットワークゲームで、パンチ遅れて出たら違和感を感じます。
一方ペダリングの場合は、基本的にはW数は連続的に値が変化するものなのです。速度変化も連続的に変化するので多少遅れても気がつきにく特徴があります。そもそも画面上のW表示の更新周期は1秒に1回程度なので、1秒以下の遅れだとあまり気になりません。
また、Zwiftの出力表示はネットワークの遅延分遅れて表示させているのではないかと思います。出力の表示自体にウエイトを持たせ、表示された出力とアバタの走り自体は一致するようににした方がプレーヤーは違和感を感じにくいと思いわれます。
他のプレーヤがどれくらいで走っているかは画面右側の倍率表示を最も頼りにしています。この更新周期も1秒に1回程度です。なので1秒以下の遅れがあったとしてもあまり気にならないと思われます。
5.まとめ・レースへの活用
以上のように、ネットワーク遅延は短く見ても0.3秒、長くて1秒程度の遅れがあると思われます。
※真相はZwiftが公開していないので分かりません。
レースする時はそれを見越して早めに対応が必要です。
・レーススタートと同時に踏み出していては遅い。
スタート1秒前から目標ワットで踏むようにする
・集団内のスピードコントロールは早めに対応
※勢い余って先頭に出ないように
・相手がアタックした時に最速で反応しても、1秒は遅れていると思った方が良い。※逆に言うとアタックする側は1秒分アドバンテージ
いただいたサポートはエクセル365の維持費にしたいと思います。