インターネットを使ってプレイしているアクション系のゲームは、常にネックになるタイムラグ。
現在プレイ中のiRacingは自動車によるレースですが、世界のプレイヤーとレースをすると、『ラグヒット』『ネットコード』と呼ばれる、接触していないのに接触したことになる事故が発生します。
この『ラグ』について、実際の数値と、プレイしているときに感じることを妄想を踏まえて記事にします。
ラグを計算
条件を絞って計算します。
サーバーとの反応速度であるpingは、iRacing上の表示は最大値が400msなようなので、実際はこれ以上の数字になっているはずです。
本当にそんなに時間がかかるのか、おおざっぱに計算します。
ワシントンは、西経77度。
東京は、東経120度。
合計すると、197度。計算が大変なので、大体180度とします。
地球の円周は、約4万km。半周で2万kmです。
東京が北緯35度とします。
cos35度0.82をかけると、16383キロ。
光速秒速30万キロ
片道で0.066秒。
往復で0.132秒。
これに加えて機械での遅延があるので、400msは現実的だと思います。
ここから、0.4秒を基本に、ラグ(見えない当たり判定)を算出します。
0.132秒なら、約3分の1にすればオッケーです。
実際の事故パターン
ここからは妄想ですが、実際のデータの扱いは以下のようなイメージではないかと感じています。
- 位置と方向など、車の状態データが、他のプレイヤーにリアルタイムで配られる
- 受け取った位置データをもとに他車の移動予測データを作り出す。
- このベクトル(移動方向と車の大きさ)に当たり判定を発生させる。
3.のベクトルが、データが受信されている間は計算されるものの、実際に受信しているデータは0.4秒前のデータなので、見えない車が症とする原因になっているのではないかと想像しています。
引き続き妄想ですが、横方向の移動がその影響を最も受けるんじゃないかと思います。
進行方向の場合、0.4秒前のデータを受けた時の複数位置データからの速度、または速度そのものを自分のパソコン上で再現しても、0.4秒遅れなので距離を取っていれば、追突することはないんじゃないかと思います。
でも、横方向の場合、接近戦をしているとわずかな『ステルス残像』により接触が起きるんじゃないかと思います。
- コーナー前に並んだ時に、ブレーキング直前で、イン側の人がアウト側の車にギリギリまで寄せた時
- アウト側の人が先にコーナリングを始めた場合、イン側の人の直進データや緩いコーナリングデータが残っている場合
- 長いコーナリング中、ギリギリまで接近した時にイン側の人がステアリングを戻してアウト側に接近した場合
イメージにしてみると、こんな感じです。
オレンジ 自車
赤 他車
アウト側に寄せた場合
他車=赤の実線の矢印は、0.4秒前のデータから試算された移動データという予想です。
赤い車は真ん中の位置まで幅寄せをしますが、例え直進に戻ったり、接触しそうになりそうなことに気づいて、上の絵のように右に寄せなおしたりこーなりんぐを始めたりしても、点線のデータが残ってしまい、見えない車が自車=オレンジに接触してしまいます。
アウト側の人が先にコーナリング
自車=オレンジがアウトからコーナリングを先に始めた場合、他車=赤のデータは実際のラインよりも外に出てくることになります。これにより、外側を走っている場合はイン側の車に接触、ひどいときは吹き飛ばされることになります。
イン側の人がステアリングを戻す
自分がアウト側で、イン側と並走してコーナリングしている場合、一つ上の状態の危険性がある上に、さらにイン側のドライバーがバランスを崩すなどでステアリングを一瞬アウト側に戻した場合、データが一瞬アウト側に残ることになる可能性があります。これにより、アウト側の自車と接触する可能性があると思います。
1つ目の、直進時の並走幅寄せのコーナリングバージョンです。
メルセデスW12の場合
時速250kmで走行中、0.4msの場合、見えない空走距離は、27.8mです。
つまり、自車のデータは、他のプレイヤーに対して0.4秒後に27.8m先に移動することになります。
実際には、遅れたデータを基にした予測データが表示されていることになるので、追突は発生しにくいとは思いますが、相手がベタベタにつけていた場合、接触の可能性はあると思います。
上の3種類の場合、サイドバイサイドでタイヤとタイヤの間の距離が1mしかないとすれば、0.4秒差であれば、秒速2.5mで接近してしまえば、左右への動きを止めたとしても、相手のパソコン上では一瞬ですが予測データが横方向に残って、相手の車に当たったことになるんではないでしょうか。
秒速2.5mといえば、W12の車幅が2mですから、1秒をかけて車幅+50cm以上を隣の車に向けて車間1mまで近づけると、それだけで接触の可能性があることになります。
左右への移動が5m/sとなると、2mの隙間があっても接触の可能性が出てくることになります。
例えば、スパのケメルストレートのエンドの道幅は10m。なので、1台が左端(右タイヤは左から2mの位置)、もう1台が右半分(左タイヤが右から2m=右端走行)を走っていて、1秒かけて2mの隙間を開けるまで(右端から6m)左に幅寄せをした場合、4mを移動することになります。右の車の移動距離が4mですから、2×4/5=1.6mの隙間でも接触の可能性が出てきます。
F3やGT3
スピードですが、実際には異なりますが、W12が250km/hに対してGT3やF3が170km/hとした場合、68%程度の違い、147%程度の違いです。
上に書いた横移動の場合、ゆっくり移動するとした場合、左右への移動が68%程度だった場合、左右への移動は3.4m/s程度です。2mや1.6mまで接近すると接触するのではなく、もっと接近できるようになります。
これらは、あくまでも、位置や車両情報からの予測された速度、方向が自分のパソコン上で再現されていた場合という想像です。実際にはどういうシステムかは知らないです。ごめんなさい。
ラグの問題点
一番困ることは、車体が見えているのに見えない接触が発生することです。
見えている車の位置に当たり判定があれば、こういった接触も発生しないはずです。
車体 VS 当たり判定 のずれは、恐らく、自分のパソコンでの、他車の車体の描画に時間がかかるせいで発生しているとは思うのですが、1mも2mもズレるのかな?という疑問はあります。例えば、100fpsで描画されていれば、0.01秒ごとに表示されます。通常のラグに加えて0.01秒なので、大きなラグにはならないはずです。例えば、上に書いた横移動5m/sであれば、わずか5cmです。
描画の回数はあくまでも回数でしかなく、表示設定している台数分の他車全ての描画までのCPUでの処理が遅れているわけでもないです。こちらも100fpsで行われているのはiRacing内での演算処理の数値から明確です。
つまり、CPUとGPUの演算で0.01秒ずつ遅れていても、0.02秒の遅れです。5m/sであれば、10㎝です。
実際のラグはもっと大きいので、ラグの原因は、インターネット回線による通信遅れ+当たり判定と描画されている車体が一致していないこと、ということになります。
私がプレイしていて感じるのは、まさにここの部分で、位置情報から描画しているのでは遅れるから、という理由で、位置情報をつなぎ合わせて、次の瞬間にはこのあたりにいそう、と予測して位置を決めていながら、実際の描画は恐らく現在の最新位置+方向で描画されているため、予測位置が先行して進んで当たり判定を持ち、本来の位置ではないところで透明車が存在することになるんではないでしょうか。
極論ですが、自分よりも前を走る車、アウト側を走る車が、自分の車にラグで接触することはない。
逆に、自分より後ろを走る車、イン側を走る車がいた場合、自分の車にラグで接触する可能性が高い。
ということになると思います。
当たり判定と実際の車の位置と方向のデータをリアルタイムに描画させると、W12であれば20m以上後方に他の車がいることになるため、あくまでも0.4秒前のデータから推測した位置で走らせないといけないのは分かるけど、描画と当たり判定がズレる理由が分かりません。
最終的なお願い
システムを知らないので詳しいことをご存じの方は、本当の内容をぜひ教えてください。
ちなみに、以前、iRacing内で公式が、
2m先に相手の人がいます
という意味の発言をされ、それくらいの距離を取るように注意喚起されていた気がします。
横方向なら車1台分です。
実車なら、残すスペースは1台分ですが、iRacingなどのレースなら、バチバチにやり合う場合でも、2台分を残すのが吉、になりそうです。
bokeboke